Header die sich verschachtelt gegenseitig inkludieren
-
Servus Leute,
Ich bin grad an einem etwas größeren Projekt mit ca. 10 verschiedenen selbstgeschriebenen Headerdateien. Dabei bin ich auf folgendes Problem gestoßen: Diese 10 Headerdateien inkludieren sich irgendwie verschachtelt gegenseitig. Alle *.h und *.cpp Dateien sind mit einer "#ifndef"-Sperre versehen und enthalten nur eine Klasse. Nun hab ich zuletzt in irgend einem Header irgend ein anderes inkludiert. Seither spuckt mir der Compiler immer aus, dass eine Klasse ein "nicht deklarierter Bezeichner" ist. Kommentier ich diese neue "#include"-Anweisung aus funktioniert es problemlos. (Ich muss nun aber mein Programm erweitern und deshalb die datei inkludieren.)
Hoffe meine verworrene Problembeschreibung erinnert euch an ein ev. bekanntes Problem, bin für jede Hilfe dankbar.mfg,
_NOOP_
-
Ich kenn ja deine Quellcodes nicht. Vielleicht kanst du in den Header-Dateien einige includes durch forward-Deklarationen ersetzen.
mfg JJ
-
Stichwort Forward-Declaration: Wenn Du in einem Header die Deklaration einer Klasse aus einem anderen Header brauchst und umgekehrt, dann schreib in den Header bevor du die Klasse verwendest ein einfaches
class Klasse1;
In der Implementationsdatei muss dann aber der komplette Klassenaufbau bekannt sein, deshalb dort ganz oben das
#include "klasse1.h"
Sollte so funktionieren...
-
NOOP schrieb:
Servus Leute,
Kommentier ich diese neue "#include"-Anweisung aus funktioniert es problemlos. (Ich muss nun aber mein Programm erweitern und deshalb die datei inkludieren.)
Hoffe meine verworrene Problembeschreibung erinnert euch an ein ev. bekanntes Problem, bin für jede Hilfe dankbar.Am besten räumst du deine Headerdateien auf und entfernst alle überflüssigen includes. Das folgende Beispiel zeigt, was man alles nicht braucht. Dabei sei jede Klasse in einer Headerdatei mit dem gleichen Namen definiert. A ist also in A.h definiert. Für die folgenden Fälle benötigst du jedoch keine einzige Headerdatei:
class A { public: class B & b; class C * c; void dfunc( class D d); void efunc( class E & e); void ffunc( class F * f); class G gfunc(); class H & hfunc(); class I * ifunc(); };
Nachdem ersetzen der unnötigen Includes durch Forwarddeklarationen sollte alles klappen.
-
Danke für alle euren Antworten. Den entsprechenden Headerinclude in der *.h-Datei hab ich durch eine Forwarddeklaration ersetzt, in der *.cpp-Datei jedoch gelassen. Jetzt erhalt ich beim Verwenden der std::list<> folgenden Fehler:
C2079: 'std::_List_nod<_Ty,_Alloc>::_Node::_Myval' verwendet undefiniertes class 'A' with [ _Ty=A, _Alloc=std::allocator<A> ]
Ich komm einfach net drauss, was ich alles durch Forwarddeklarationen ersetzen soll. Überall, in allen Header- und Implementierungsdateien, inkludiere ich nur alle Headerdateien der im jeweiligen Quellcode erwähnten Klassen.
Tut mir Leid für mein Unvermögen, ein einfaches Problem zu beseitigen, 'bin aber auch sonst schwer von Begriff
mfg,
_NOOP_
-
Bin ich eigntlich der einzige der seine Header folgendermassen aufbaut?
class A; #ifndef A #define A A #include"B.h" class A{ //... }; #endif
Man muss nur darauf achten, dass inline Funktionen nicht auf Funktionen von anderen Klassen zurückgreifen.
-
@irgendwer: Wenn ich den Fehler wegbekomme, bist du nicht mehr der einzige, der seine Header so aufbaut
.
Der Fehler geht aber net weg.. Was auch immer ich mache. Dagegen ist mir aufgefallen, dass ich meine *.cpp-Dateien recht unüblich auch mit nem "#ifndef _A_CPP" absichere. Meint ihr das könnte daran liegen?mfg,
_NOOP_
-
Bevor sich noch einer bemüht, mir zu helfen: Danke an alle
Wie gesagt, war etwas schwer von Begriff, hab zwar net genau verstanden wieso es so funktioniert, aber das tut es.
Ich weiss aber net an was genau es gelegen hat. Hab jetzt die Methode von irgendwer übernommen und zusätzlich das gemacht, was ihr mir alle empfohlen hattet, ich aber an falscher Stelle gemacht hatte: den include durch einen forward ersetzt.Danke noch mal