Was ist der beste Weg, um mit abhängigen Klassen in C ++ umzugehen?

8

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?

    
Nathan Osman 27.01.2010, 00:18
quelle

4 Antworten

23

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%     
Reed Copsey 27.01.2010, 00:21
quelle
2

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)

    
Jason S 27.01.2010 00:21
quelle
1

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"

enthalten

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.

    
Chris Dodd 27.01.2010 01:05
quelle
0

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.

    
Nick Bedford 27.01.2010 00:20
quelle

Tags und Links