2009-12-03 9 views
19

Also ich habe eine Klasse A, wo ich einige Klasse B Funktionen aufrufen möchte. Also schließe ich "b.h" ein. Aber in Klasse B möchte ich eine Klasse-A-Funktion aufrufen. Wenn ich "a.h" einschließe, endet es in einer Endlosschleife, richtig? Was kann ich tun?können sich zwei Klassen mit C++ sehen?

Antwort

26

Jede Klasse (A und B) sollte eine Header-Datei und eine Implementierungsdatei haben.

Jede Header-Datei (zB A.h) soll nicht die andere Header-Datei (zB B.h) umfasst einen Vorwärts Bezug auf die anderen Klasse (zB eine Aussage wie class B;) und kann dann mit Zeiger und/oder Verweise enthalten kann die andere Klasse in ihrer Deklaration (z. B. class A kann eine B* als Datenelement und/oder als Methodenparameter enthalten).

Jede CPP-Datei (z. B. A.cpp) kann mehr als eine Header-Datei enthalten (z. B. A.h und B.h). Es wird empfohlen, dass jede CPP-Datei zuerst ihre eigene Header-Datei enthält (z. B. A.cpp sollte A.h und dann B.h, während B.cppB.h und dann A.h enthalten sollte).

Jede Header-Datei sollte nur die Deklaration und nicht die Definition der Klasse enthalten: Zum Beispiel werden die Signaturen der Methoden der Klasse aufgelistet, aber nicht die Methoden-Körpern/Implementierungen (die Methoden-Körpern/Implementierungen sind in) die Datei, nicht in der Header-Datei). Da die Header-Dateien keine Implementierungsdetails enthalten, sind sie daher nicht von Details anderer Klassen abhängig (müssen diese nicht sehen). Sie müssen höchstens wissen, dass zum Beispiel B der Name einer Klasse ist, die sie von einer Vorwärtsdeklaration erhalten kann, anstatt eine Headerdatei in eine andere Headerdatei aufzunehmen.

35

Fügen Sie nur Elementfunktionsdeklarationen in Headerdateien (.h) ein und fügen Sie Elementfunktionsdefinitionen in Implementationsdateien (.cpp) ein. Dann müssen sich Ihre Header-Dateien nicht gegenseitig einschließen, und Sie können beide Header in beide Implementierungsdateien einschließen.

Für die Fälle, wenn Sie die andere Klasse in dem Mitglied Signaturen als auch verweisen müssen, können Sie eine Forward-Deklaration verwenden:

class A; 

Diesen Sie Zeiger und Referenztypen (A* und A&) verwenden kann, wenn auch nicht A selbst. Sie können auch keine Mitglieder anrufen.

Beispiel:

// a.h 
struct B; // forward declaration 

struct A { 
    void foo(B* b); // pointers and references to forward-declared classes are ok 
}; 


// b.h 
struct A; // forward declaration 

struct B { 
    void bar(A& a); // pointers and references to forward-declared classes are ok 
}; 


// a.cpp 
#include "a.h" 
#include "b.h" 

void A::foo(B* b) { 
    b->bar(*this); // full declaration of B visible, ok to call members now 
} 


// b.cpp 
#include "a.h" 
#include "b.h" 

void B::bar(A& a) { 
    a.foo(this); // full declaration of A visible, ok to call members now 
} 
-7

Versuchen Sie #ifndef, #define und #endif um Ihre .h-Dateien.

+1

Auch dieser Beitrag beantwortet die Frage nicht .. –

Verwandte Themen