2013-06-16 12 views
5

次のタイプの循環依存関係をどのように解決すればよいですか?各従属構造がそのメソッドにアクセスする循環依存関係を解決する

//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

利用前方宣言 –

+0

、::何か()が呼び出されます。同様に、B :: fi(con​​st A&)が呼び出されるため、A.hppでBを宣言することはできません。 – MVTC

+0

なぜあなたは上記のようにすることはできませんが、 'B.cpp'に' #http 'を含めるのはなぜですか? –

答えて

5

転送先AB.hppとし、A.hppB.cppに含めます。それは前方宣言のためのものです。私はちょうど前方ためB.cppにB.hppで宣言することはできません

1

あなたはABのための基底クラスを定義し、別のヘッダにこれらの塩基の仮想関数としてfisomethingを定義することができます。次に、ABのこれらのヘッダーを含めます。

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(); 
} 
関連する問題