Warum ist C++ so doof und lässt mich Header nicht gegenseitig inkludieren&nutzen?
-
[C++-bashing gelöscht]
-
Es scheint dir nicht bewusst zu sein, aber #include ist dafür da, die angegebene Datei genau an der jeweiligen Stelle einzufügen.
Das Problem sollte offensichtlich sein, wenn zwei Dateien versuchen, sich gegenseitig einzubinden. #pragma once verhindert, dass dieselbe Datei mehr als einmal in der Übersetzungseinheit eingebunden wird.Die Lösung ist aber einfach und nennt sich forward declaration.
Statt den Class1-Header in Class2.h einzubinden, schreibst du class Class1; und die Existenz der Klasse ist ab sofort bekannt. Die Verwendung von Referenzen und Zeigern erfordert es auch nicht, dass die vollständige Deklaration von Class1 bekannt ist.
-
Es ist völlig korrekt das der Compiler dir nicht die Möglichkeit gibt. Es ist auch kein Fehler, sondern physikalisch unmöglich! Denn bei deinem Fall muß zu jedem Zeitpunkt die komplette Typ-Definition des jeweils anderen Value-Objekt vorhanden sein. Das geht aber real garnicht.
Du hast deshalb folgende Möglichkeit:
Benutze in einer der Klassen Referenzen oder Pointer, denn die verlangen keine Definition. Dann kannst du eine Forward-Deklaration benutzen. Bsp:#pragma once class Class2; // Forward declaration class Class1 { Class2 &class2; // hier eine Referenz. Alternativ auch Pointer oder besser Smartpointer möglich }; // In der Class1.cpp-Datei kannst/mußt du jetzt Class2.h inkludieren!!!Angeblich soll man auch Forward Declarations bei Value-Objekten nutzen können. Habe ich aber bisher nicht ausprobiert.
-
[C++-bashing gelöscht]
-
zustimmer schrieb:
[C++-bashing gelöscht]
Der OP hat eine Aussage auf Grund von Unwissenheit getätigt. Deine Wiederholung dieser Aussage wird dadurch nicht richtig.
Zum Thema: Die anderen Sprachen haben das Thema nicht, weil sie keine Value-Objekte zulassen! Die sogenannten "modernen" Sprachen wie Java, C# usw. kennen nur Referenzen! Und deren "Import"-Anweisung ist vergleichbar mit einem Forward-Declaration. Wenn diese Sprachen auch Value-Objekte kennen würden, hätten sie die selben Schwierigkeiten! So wird ein Schuh draus.
Wenn man das gleiche Verhalten/Einfachheit haben will, sollte man in C++ auf Smart-Pointer setzen und somit die Objekte auf dem Freestore anlegen, so wie es die "modernen" Sprachen durchgängig vom Anwender erzwingen. C++ verlangt das nicht, erlaubt halt mehrere Designs. Und es gibt ja
shared_ptr<T>im C++-Standard, um einfach mit Freestore-Objekten zu arbeiten, wenn man kein Value-Objekt will.