2013-06-16 6 views
5

Jak rozwiązać następujący typ zależności cyklicznej?Rozwiązywanie zależności cyklicznej, w której każda struktura zależna uzyskuje dostęp do swoich metod.

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

używane są deklaracje –

+0

Nie mogę po prostu do przodu zadeklarować w B.hpp ponieważ w B.cpp, A :: coś() jest wywoływana. Podobnie nie mogę po prostu przekazać dalej deklaracji B w A.hpp, ponieważ wywoływana jest B :: fi (const A &). – MVTC

+0

Dlaczego nie możesz zrobić tak jak powyżej, ale także '#include" A.hpp "' w 'B.cpp'? –

Odpowiedz

5

Przekaż, aby zadeklarować A w B.hpp, jak masz, a następnie dołączyć A.hpp do B.cpp. Po to właśnie są deklaracje przyszłościowe.

1

Można zdefiniować klasy bazowe dla A i B i zdefiniować fi i something jako wirtualne funkcji tych baz w oddzielnych nagłówków. Następnie dołącz te nagłówki zarówno z A i 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(); 
} 
Powiązane problemy