Klassen oder Namespaces, die sich gegenseitig benutzen



  • Hi,
    erstmal sorry für den dummen Titel, aber mir ist wirklich nichts besseres eingefallen.
    Mein Problem ist folgendes: Ich habe zwei Namespaces, die jeweils ein Element aus dem Andren Benutzen, zum Beispiel so:

    namespace A
    {
    int a=3;
    int b=B::b;
    }
    
    namespace B
    {
    int b=1;
    int a=A::a;
    }
    

    Das Problem ist jetzt, dass ich, egal welchen namespace ich zuerst definiere, einen "not declared in this scope"-Fehler bekomme, was ja auch verständlich ist, weil immer ein Namespace noch nicht deklariert ist, wenn der andere darauf zugreifen will.
    DiesesProblem lässt sich ja auch noch recht einfach lösen:

    namespace A { int a=3; }
    namespace B { int b=1; }
    namespace A { int b=B::b; }
    namespace B { int a=A::a; }
    

    Ich finde das aber überaus unpraktisch, insbesondere wenn man noch mehr namespaces hat, und wenn man die Definitionen von A und B in getrennte Dateien tun will, wird es völlig unmöglich.
    Mit Klassen verhält es sich genauso.

    Hat jemand eine Idee, wie man dieses Problem umgehen kann?

    danke für eure Hilfe,

    Morph



  • ich weiss nich wies bei namespaces is aber bei klassen benutzt du dafür vorwärtsdeklarationen

    classA.h
    class B;
    class A 
    {
      B b;
    };
    
    classB.h
    class A;
    class B
    {
      A a;
    };
    
    classA.cpp
    #include <classA.h>
    #include <classB.h>
    
    classB.cpp
    #include <classA.h>
    #include <classB.h>
    

    für vorwärtsdeklarationen gilt dass du variablen von dem typ deklarieren darfst
    du darfst bloss keine memberfunktionen aufrufen wenn nur die vorwärtsdeklaration drin is



  • Sovok schrieb:

    ich weiss nich wies bei namespaces is aber bei klassen benutzt du dafür vorwärtsdeklarationen

    classA.h
    class B;
    class A 
    {
      B b;
    };
    
    classB.h
    class A;
    class B
    {
      A a;
    };
    

    Fast richtig! 😉 Du darfst auch nicht auf das Wissen über die Grösse angewiesen sein, daher kann eine vorwärtsdeklarierte Klasse auch nicht Member sein, sehr wohl aber ein Zeiger oder eine Referenz darauf, also eher z.B.:

    classA.h
    class B;
    class A 
    {
      B* b;
    };
    
    classB.h
    class A;
    class B
    {
      A& a;
    };
    


  • jep jetzt passts 🙂



  • Hmm, ok, so weit so gut.
    Wenn ich jetzt aber im Konstruktor von A schreibe:

    b = new B;
    

    und im Konstruktor von B das gleiche mache (nur mit a und A halt), funktioniert das nur bei der als zweites mittels #include eingebundenen ( und damit als zweites definierten ) Klasse, bei der anderen erhalte ich den Fehler:

    In file included from test.c++:1:
    test_A.h: In constructor `A::A()':
    test_A.h:8: error: invalid use of undefined type `struct B'
    test_A.h:1: error: forward declaration of `struct B'
    

    Klar, denn an der Stelle kan ich noch kein Objekt bilden, weil die Klasse ja noch nicht definiert ist.
    Danke bis jetzt, ihr habt mir schon viel geholfen.

    Morph


Anmelden zum Antworten