Angenommen, ich habe eine Klasse foo mit einem Objekt der Klassenleiste als Mitglied
%Vor%Nun nehme ich an, dass die Leiste den Überblick darüber behalten muss, wem sie gehört
%Vor%Die beiden Klassen verweisen aufeinander und ohne eine Vorwärtsdeklaration werden sie nicht kompiliert. Das Hinzufügen dieser Zeile vor der foo-Deklaration löst also dieses Problem
%Vor%Nun, hier ist das Problem - beim Schreiben der Header-Dateien hängt jeder Header von dem anderen ab: foo.h benötigt die Definitionen in bar.h und umgekehrt. Was ist der richtige Weg, damit umzugehen?
Sie müssen den gesamten Mitgliederzugriff aus der Kopfzeile und in Ihre Quelldateien verschieben.
Auf diese Weise können Sie Ihre Klassen in der Kopfzeile weiterleiten und sie in foo definieren:
%Vor%Damit können Sie arbeiten - Sie können einfach keine Definitionen einfügen, die Mitgliederinformationen in Ihre Kopfzeile benötigen - verschieben Sie sie in die CPP-Datei. Die CPP-Dateien können sowohl foo.h als auch bar.h:
enthalten %Vor%Ich denke, ein Weg besteht darin, abstrakte Interface-Klassen ohne Member zu erstellen. Dann Unterklasse foo und bar aus diesen Interface-Klassen.
z.B.:
%Vor%Dies unterbricht den Zyklus der Abhängigkeiten (außer die Schnittstellen selbst sind voneinander abhängig, und wenn das der Fall ist, sollten sie wahrscheinlich in der gleichen Datei deklariert werden)
In Ihrem Beispiel hängt foo
von bar
ab (weil es ein tatsächliches Objekt bar
enthält), aber bar
hängt nicht von foo
ab (da es nur ein foo *
enthält). Nun hängt bar
davon ab, dass foo
ein Typname ist, also benötigt bar.h eine Forward-Deklaration des Namens: class foo;
. foo
hängt von bar
ab, daher sollte foo.h #include "bar.h"
Sie können keine Klassen haben, die in C ++ direkt voneinander abhängen; Es funktioniert einfach nicht. Sie müssen die Klassen so entkoppeln, dass die eine nur von der anderen abhängt, wie in Ihrem Beispiel. Die einzigen Dinge, die eine direkte Abhängigkeit erzeugen, sind die Verwendung einer Klasse als Basisklasse oder als Feld; jeder andere Gebrauch schafft nur eine indirekte Abhängigkeit, die im Allgemeinen kein Problem ist.
Soweit ich weiß, ist die einzige Möglichkeit, Zeiger zu verwenden, da sie keine Klassendefinition erfordern, bis die Übersetzungseinheit (.cpp) in diesem Fall beide Klassen richtig definiert hat.