2013-06-16 2 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 (const A &)가 호출되기 때문에 A.hpp에서 B를 선언 할 수 없습니다. – MVTC

+0

위와 같이 할 수 없으며'#include "A.hpp"'B.cpp'에도 없습니까? –

답변

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(); 
}