2012-08-15 9 views
5

So che domande simili a questo sono state fatte prima, ma dopo aver fatto la mia ricerca ho ancora domande sull'intestazione circolare.L'intestazione circolare C++ include

//FooA.h 
#ifndef H_FOOA 
#define H_FOOA 

#include "foob.h" 

class FooA{ 
    public: 
     FooB *fooB; 
}; 


//FooB.h 
#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 

Ora, se ho due dipendenze circolari questo è il modo in cui ho visto la gente su StackOverflow aggirare il problema. Il mio unico problema è che nel mio main.cpp devo includo fooa.h prima e poi foob.h

//main.cpp the right way 
#include "fooa.h" 
#include "foob.h" 

//main.cpp that will surely get a compile error 
#include "foob.h" 
#include "fooa.h" 

Ora la mia domanda è "c'è un modo di trasmettere dichiarare queste classi in un modo che sarà permettimi di non preoccuparmi dell'ordine in cui includo i file header nel mio main.cpp? "

+0

Poiché le risposte hanno sottolineato, è possibile utilizzare una dichiarazione anticipata in entrambi i file. Se la situazione fosse più complicata, potresti '#includere" fooa.h "' da 'foob.h', che garantirebbe l'ordine di inclusione desiderato. –

+0

Non c'è nulla di circolare negli include nel codice di esempio. Se aggiungi il # end mancante manca tutto. Che errore di compilazione stai ottenendo? –

risposta

7

C'è un modo per inoltrare dichiarare queste classi in un modo che mi consenta di non preoccuparmi dell'ordine in cui includo i file di intestazione nel mio main.cpp?

dal momento che si tratta di semplici puntatori solo, è possibile utilizzare una dichiarazione anticipata qui in entrambi i casi:

FooA.h

#ifndef H_FOOA 
#define H_FOOA 

// #include "foob.h" << not needed! 
class FooB;  // << substitute with a forward declaration of FooB 

class FooA{ 
    public: 
     FooB *fooB; 
}; 
#endif 

FooB.h

#ifndef H_FOOB 
#define H_FOOB 

class FooA; 
class FooB{ 
    public: 
     FooA *fooA; 
}; 
#endif 
+0

@ user1600812 esattamente, e il principale può includere i file necessari: utilizzando questo esempio, l'ordine non ha importanza. – justin

+0

Credo di aver dimenticato di menzionarlo nel mio codice specifico. fooa.h forward si dichiara perché ci sono un paio di puntatori autoreferenziali nel mio codice. Nel mio caso specifico, non penso che potresti farlo a modo tuo perché sarei in grado di dichiarare una lezione due volte. Comunque nell'esempio che ho fatto sopra la tua soluzione funziona.Grazie. – user1600812

+0

@ user1600812 C++ consente più dichiarazioni di inoltro (ad esempio in file separati). – justin

2

Non è necessario preoccuparsi dell'ordine perché fooa.h include foob.h e foob.h ha la dichiarazione di inoltro per FooA. Tutto è corretto già nel tuo codice.

+1

Modulo mancante # endif, non c'è alcun problema con il codice come pubblicato. Non c'è nemmeno circolarità, il che mi fa sospettare che manchi qualcosa. –

1

Poiché entrambe le classi contengono semplicemente un puntatore, non è necessario includere l'altra intestazione. Farà una dichiarazione in avanti.

Qualsiasi codice che utilizzi effettivamente l'altra classe avrà l'intestazione, ma dovrebbe essere in un file cpp.

1

Utilizzare una dichiarazione diretta in entrambi i file di intestazione.

Sapevi che puoi dichiararlo sulla stessa linea?

In "FooB.h"

class FooB{ 
    public: 
     class FooA *fooA; 
}; 

In "FooA.h"

class FooA { 
    public: 
     class FooB *fooB; 
}; 
+0

non faranno rispettivamente riferimenti a FooB :: FooA e FooA :: FooB? –