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 :))


Anmelden zum Antworten