gegenseitiges includieren von Headerdateien
-
Hallo, ich habe ein Problem mit 2 Headerdateien die sich gegenseitig includieren, das ganze sieht ungefähr so aus :
/***** header_1.h *****/
#include "h2.h"
class h1
{public :
h2 * var;
};
/***** header_1.h *****//***** header_2.h *****/
#include "h1.h"
class h1
{public :
void AddElement( h1 * var);
};
/***** header_2.h *****/Dadurch entsteht logischerweise etwas wie eine Endlosschleife.
(Compiler-Meldung :
warning C4182: #include nesting level is 361 deep; possible infinite recursion
fatal error C1076: compiler limit : internal heap limit reached; use /Zm to specify a higher limit
)
Kann mir jemand einen Rat geben was ich dagegen tun kann ? ( Ich komme aus der Java-Ecke, solche Probleme waren mir bisher fremd )Danke für jegliche Hilfe,
oliver
-
die Klasse deklarieren und erst in der .cpp Datei die nötigen Header inkludieren.
//z.B. class A; class B;
-
Kann mir jemand einen Rat geben was ich dagegen tun kann ?
wenn du ne Klasse nicht instanzieirst, also im header nur Referenzen oder Pointer auf die klasse verwendest, kannst sie Forward deklarieren ....
/***** header_1.h *****/ class h2; // forward deklaration class h1 {public : h2 * var; }; /***** header_1.h *****/ /***** header_2.h *****/ class h1; // forward deklaration class h2 {public : void AddElement( h1 * var); }; /***** header_2.h *****/
Den header von der Klasse brauchst in deinem fall erst in der cpp einbinden, also h1.cpp und h2.cpp muessten beide h1.h und h2.h includieren ...
Ciao ...
-
Oder einfach ein Includewächter benutzen:
#ifndef KLASSE_1 #define KLASSE_1 class klasse1 {}; #endif
so verhinderst du die endlose rekursion
-
Um unendliche Rekursionen bei Includefiles zu verhindern, baut man eigentlich immer Inklude-Waechter ein:
// Datei: header.h #ifndef HEADER_H #define HEADER_H // inhalt #endif
Hat auch den Vorteil, das die Definitionen nicht mehrmals geparst werden.
-
Danke für die schnellen Antworten, ich hab das ganze mit der Forward variante gelöst, das mit den include-wächtern hatte ich auch schon probiert, hatte aber nicht funktioniert, weil jede der Klassen ja einen Member vom Typ der anderen Klasse beinhaltet ( oder hab ich da was falsch verstanden )
-
Schön, dass sich hier keiner wiederholt.
(Keine Kritik, nur witziger Zufall, da 2 Paare :))