2013-06-16 7 views
5

Come devo risolvere il seguente tipo di dipendenza circolare?Risoluzione della dipendenza circolare in cui ogni struttura dipendente accede ai suoi metodi

//A.hpp 
#include "B.hpp" 

struct A { 
    B b; 
    int foo(); 
}; 

//A.cpp 
#include "A.hpp" 

int A::foo{ 
    b.fi(*this); 
} 


//B.hpp 
struct A; 

struct B { 
    int fi(const A &a); 
}; 

//B.cpp 
#include "B.hpp" 

int B::fi(const A &a){ 
    if(a.something()) 
     something_else(); 
} 
+5

utilizzare le dichiarazioni previsionali –

+0

Non posso semplicemente avanti dichiarare una in B.hpp perché in B.cpp, A :: qualcosa() viene chiamato. Allo stesso modo non posso semplicemente inoltrare la dichiarazione B in A.hpp perché viene chiamato B :: fi (const A &). – MVTC

+0

Perché non puoi fare come sopra, ma anche '#include" A.hpp "' in 'B.cpp'? –

risposta

5

Inoltra dichiara A in B.hpp come hai ,, quindi includere A.hpp in B.cpp. Ecco a cosa servono le dichiarazioni anticipate.

1

È possibile definire le classi di base per A e B, e definire fi e something come funzioni virtuali di queste basi in intestazioni separate. Quindi includi queste intestazioni sia da A sia da B.

1
//B.hpp 

struct A; 

#ifndef B_H // <-- header guard 
#define B_H 

struct B { 
    int fi(const A &a); 
}; 

#endif 

//B.cpp 
#include "A.hpp" // <-- so that fi() can call A::something() 
#include "B.hpp" 

int B::fi(const A &a){ 
    if(a.something()) 
     something_else(); 
} 
Problemi correlati