2013-06-16 4 views
5

Wie soll ich den folgenden Typ der zirkulären Abhängigkeit auflösen?Auflösen der zyklischen Abhängigkeit, in der jede abhängige Struktur auf ihre Methoden zugreift

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

Sie mit der Vorwärts Erklärungen –

+0

Ich kann nicht nur nach vorn A in B.hpp erklären, weil in B.cpp, A :: etwas() aufgerufen wird. Ebenso kann ich B nicht einfach in A.hpp weiterleiten, weil B :: fi (const A &) aufgerufen wird. – MVTC

+0

Warum können Sie nicht tun, was Sie oben tun, sondern auch '#include" A.hpp "' in 'B.cpp'? –

Antwort

5

Forward deklarieren Sie A in B.hpp, wie Sie haben, dann enthalten A.hpp in B.cpp. Dafür sind Vorwärtsdeklarationen gedacht.

1

Sie können Basisklassen für A und B definieren und fi und something als virtuelle Funktionen dieser Basen in separaten Header definieren. Fügen Sie dann diese Header von A und B ein.

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