HOWTO: Doppelinclude...



  • Also ich bräuchte 2 Klassen, die sich gegenseitig includen...
    Also:

    class A;
    class B;
    
    class A
    {
         B EinB;
    };
    
    class B
    {
         A EinA;
    };
    

    Nun meckert allerdings der Kompiler, weil er eine der beiden Dateien zuerst includen muss.
    Klasse A und Klasse B stehen in unterschiedlichen Header.
    Obige Lösung mit den Vorwärtsdeklarationen klappt auch nicht.
    Gibt es einen anderen Weg es so wie oben gezeigt zu machen ohne das man z.B.
    einen cast durchführen muss?

    Danke im voraus für alle Antworten.



  • Also, in eine Datei (A) kannst du wie gewohnt includen und in die andere (B)musst du

    class CKlasseA;
    

    schreiben. Bei der musst du dann eben im Cpp includen.

    Das bedeutet aber auch, dass du die KlasseA erst im cpp benutzen darfst.

    Das hat bei mir immer funktioniert.



  • Könntest du ein Beispiel schreiben?
    Ich glaube das ich es so geschrieben habe wie du es ausführst, allerdings muss ich casten und dass möchte ich vermeiden.

    Danke.



  • Datei A.h

    #include "B.h"
    
    class A
    {
        B einB;
        B Get();
    };
    inline B Get()
    {
        return einB; // Das darf man.
    }
    

    Datei B.h

    class A;
    
    class B
    {
        A einA;
        A Get(); // das sollte noch gehen, aber...
    };
    inline A Get()
    {
        return einA; // ... das darf man nicht machen!!! (muss in cpp)
    }
    

    Datei B.cpp

    #include "A.h"
    
    einA.einB = ???; // was auch immer...
    


  • Ich werde es sobald als moglich testen.
    Danke für die schnelle Antwort!



  • das beispiel in deinem ersten beitrag kann garnicht funktionieren. die klassen können sich doch nicht gegenseitig benötigen. das gibt ja ne endlosrekursion.



  • Genau wegen der Rekusion mache ich ja das eine Include erst in der Cpp Datei. Da ist das keine Rekursion mehr.

    Wenn du aber eine bessere Idee hast, kannst du sie uns gerne schreiben. Ich lerne gerne dazu, vor allem wenn es irgendwelche Tricks sind.



  • Hi,

    der Weg mit der forward Deklaration ist schon richtig, allerdings darfst du das Objekt erst verwenden, wenn du es includet hast. Nach einer Forward Deklaration sind nur Pointer benutzbar.

    Bsp:

    class b;
    class a
    {
        b m_b; /** Fehler, weil Funktionen und Member nicht bekannt sind,
               *   und der Compiler nicht weis wieviel Speicher er 
               *   bereitstellen muss
               **/
    
       b *m_pb; /** Kein Fehler weil Pointer immer 4 Byte benötigt.
                *   Es dürfen aber keine Member oder Funktionen im h-File 
                *   verwendet werden, da Funktionen und Member noch nicht 
                *   bekannt sind, im cpp-File kann dann die klasse b ganz 
                *   normal verwendet werden, nachdem ein #include b.h erfolgte.
                **/
    };
    
    #include a.h
    class b
    {
        a m_a; // Kein Fehler weil a bekannt ist
    };
    

    Ich hoffe alle klarheiten sind beseitigt.

    MFG
    Kai



  • Danke!

    Ich wußte doch, dass ich irgendwas vergessen hatte. *verlegen grins*

    Das war auch der Grund warum ich den ganzen Kram nicht wirklich mochte. Zeiger machen zu gerne Ärger.


Anmelden zum Antworten