Toon posts:

[C++] include-probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb in al mijn .h-files heb ik #ifndef, #define, #endif
Elke file bestaat uit 1 class en een paar includes:

C++:
1
2
3
4
5
6
7
8
9
// F:
#include "P.h"
#include "L.h"

class F
{
  L loc;
  P pi;
};


C++:
1
2
3
4
5
6
7
// P:
#include "B.h"
#include "L.h"

class P
{
};


C++:
1
2
3
4
5
6
7
// B:
#include "L.h"
#include "F.h"

class B
{
};


code:
1
2
3
4
5
6
7
8
file F:

include P
 --> include B
  --> include L
  --> include F
 --> include L
include L


Nu geeft ie een melding dat ie in class 'F', "P pi" niet kent.
Zeer waarschijnlijk is dit met mijn recursieve includes.

Kan er mij iemand zeggen hoe ik dit kan oplossen?

Thx!

  • Radiant
  • Registratie: Juli 2003
  • Niet online

Radiant

Certified MS Bob Administrator

Je kan het beste 1 headerfile maken waar je al je een prototype van al je classes in zet, en die include voor de andere includes. Zoiets dus:
C++:
1
2
3
4
class P;
class B;
class F;
class L;

enz.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 07-05 22:49

curry684

left part of the evil twins

Nogal logisch he, je moet alleen dingen includen waar je echt afhankelijk van bent. Zoals ik het zo snel zie is er voor P en B geen enkele reden om die andere files te includen, dus moeten ze het niet doen.

Met forward declarations kun je ook veel oplossen for the record.

Professionele website nodig?


Verwijderd

Topicstarter
Ik include enkel wat nodig is... In die class B & P zijn er parameters die ... Effe voorbeeldje geven want anders snap ik het zelf niet meer ;)
C++:
1
2
3
4
5
6
7
8
9
// B: 
#include "L.h" 
#include "F.h" 

class B 
{
  bool isOK( const L& loc );
  void setup( const F& fac );
};


Ook heb ik dit geprobeerd met een forward declaratie van "class P;"; in "p.h", maar ook dit geeft niet het gewenste resultaat.

code:
1
error C2079: 'pi' uses undefined class 'P'

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Die forward declaratie moet ook in de file die P& gebruikt, en niet in p.h

Verder:
C++:
1
2
3
4
#ifndef F_H_INCLUDED
#define F_H_INCLUDED
// Hier gaat de echte inhoud van F.h
#endif // F_H_INCLUDED

Dan kun je nooit per ongeluk een recursive include doen.

[ Voor 56% gewijzigd door MSalters op 21-04-2005 14:35 ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Sorry ja, inderdaad, die staat in f.h:

C++:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#ifndef INC__F_H
#define INC__F_H

#include "defs.h"
#include "P.h"
#include "L.h"

class F
{
public:
  L loc;
  P pi;

  inline bool isOK( ) const { return p.isOK() && loc.isOK() }
};

#endif // INC__F_H


Ik vind het maar een beetje vaag waarom hij die fout geeft... Ook niet met "class P;" als forward declaratie erbij...


En ik doe (zoals vermeld in de 1e post) in elke file een ifndef, define, endif...

[ Voor 17% gewijzigd door Verwijderd op 21-04-2005 15:26 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Ja, nou heb je dus weer een class F die wel degelijk een P bevat. Kijk, het moge duidelijk zijn dat je geen class A kunt hebben die een B bevat die een C bevat die een A bevat. Dan heb je een design fout.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


Verwijderd

Topicstarter
Het is inderdaad spagetti... Ik heb dan eventjes design aangepast & nu zou ie wel duidelijk moeten compilen.

Thx voor te zeggen dat ik een beetje dwaas was ;)

[ Voor 84% gewijzigd door Verwijderd op 21-04-2005 19:13 ]

Pagina: 1