2009-06-15 21 views
14

Ich bin neu in C++, also kann diese Frage grundlegend sein:Zwei Klassen, die sich aufeinander beziehen

Ich habe zwei Klassen, die aufeinander verweisen müssen. Jeder befindet sich in einer eigenen Header-Datei und # enthält die Header-Datei des anderen. Wenn ich versuche zu kompilieren, bekomme ich den Fehler "ISO C++ verbietet die Deklaration von 'Foo' ohne Typ" für eine der Klassen. Wenn ich die Dinge so umschalte, dass der entgegengesetzte Header zuerst geparst wird, bekomme ich den gleichen Fehler mit der anderen Klasse.

Ist es in C++ möglich, zwei Klassen zu haben, die Referenzen zueinander benötigen?

Für weitere Details: Ich habe eine "App" -Klasse und eine "Window" -Klasse. App muss auf Fenster verweisen, um das Fenster zu erstellen. Fenster hat eine Schaltfläche, die zurück zur App ruft, also benötigt es einen Verweis auf App. Wenn ich nicht zwei Klassen aufeinander beziehen kann, gibt es einen besseren Weg, dies zu implementieren?

+2

Es sollte beachtet werden, dass wechselseitige Abhängigkeiten möglichst vermieden werden sollten. Wäre es sinnvoll, die Funktionalität der Schaltflächen in der App in ein separates Controller-Objekt zu übernehmen? –

+0

Ich finde dieses Problem ziemlich oft in meinen kleinen Spielen. Ich habe ein World-Objekt, das Game-Objekte enthält, die z. B. auf das World-Objekt verweisen müssen. Kollisionserkennung. Ich habe keinen guten Weg gefunden, das umzubauen. (Und übrigens, ich wecke eine 7 Jahre alte Diskussion, um mir eine Art Abzeichen zu verdienen) – Johan

Antwort

27

Sie können Vorwärtsdeklarationen in den Headerdateien verwenden, um zirkuläre Abhängigkeiten zu umgehen, solange Sie keine Implementierungsabhängigkeiten in den Headern haben. In Window.h, fügen Sie diese Zeile:

class App; 

In App.h, fügen Sie diese Zeile:

class Window; 

diese Zeilen vor den Klassendefinitionen hinzufügen.

In den Quelldateien können Sie dann die Header für die eigentlichen Klassendefinitionen einfügen.

Wenn sich Ihre Klassendefinitionen auf Elemente der anderen Klasse beziehen (z. B. in Inlines), müssen sie in die Quelldatei verschoben werden (nicht mehr inline).

8

Vorwärtsdeklaration ist der Weg zu gehen.

Wenn Sie im Klassenheader pointer \ reference verwenden, würde die Deklaration von Forward auf beiden Seiten für Sie funktionieren.

Wenn Sie das Objekt als Klassenmitglied erstellen, müssen Sie den Header selbst einschließen. (Die Vorwärtsdeklaration funktioniert nicht, da der Compiler für die Kenntnis der Größe eine Klassendefinition benötigt).

Refer C++ FAQ for solving such senario:

Wenn Sie das Fenster als Mitglied dann schaffen gehören die Fenster-Header in App aber zugleich Fenster sollte nicht dem Header der App enthalten. Verwenden Sie die Kombination aus Zeiger auf App und der Vorwärtsdeklaration dort.

Verwandte Themen