Forward Deklaration



  • B->Anything();
    

    🙄

    Deine Instanz heißt 'Binstanz'.

    edit: Ich verstehe die Fehlermeldung nicht, wo ist 'status' und 'Launcher' definiert?

    Thingol 🙂



  • Ok ich hab was vergessen:

    class B;
    
    class A
    {
      public:
        void AnythingA();
        B* Binstanz;
        inline void DoB()
        {
          Binstanz = new B;
          Binstaz->AnythingB();
        }
    };
    
    class B
    {
      public:
        void AnythingB();
        A* Ainstanz;
        inline void DoA()
        {
          Ainstanz = new A;
          Ainstanz->AnythingA(); 
        }
    };
    

    Hat sowas eigentlich ein Namen ?

    Launcher ist Klasse B, status ist in Klasse B.
    Klasse A will auf Klasse B zugreifen.
    Aber das will er nicht haben 😉



  • this->that schrieb:

    Klasse B vor Klasse A definieren.

    Wie 'this->that' schon erwähnt hat, muss die Definition vor 'A' erfolgen. In deinem Fall in eine Header-Datei.

    Das 'inline' ist meines Wissens nicht notwendig, weil du die Methode ja schon in der Klassendefinition definierst -> inline. (Ich lasse mich eines besseren belehren, falls die Aussage falsch war).

    edit: Irgendwie bin ich mir doch nicht mehr so sicher...

    Thingol 🙂



  • d.h. Ich muss sie in 2 header, mit includeguards tun ?



  • Tim06TR schrieb:

    ...Hat sowas eigentlich ein Namen ?...

    Designfehler?!



  • Tim06TR schrieb:

    d.h. Ich muss sie in 2 header, mit includeguards tun?

    Nein.

    class B;
    
    class A
    {
      public:
        void AnythingA();
        B* Binstanz;
        inline void DoB(); // inline
    };
    
    class B
    {
      public:
        void AnythingB();
        A* Ainstanz;
        void DoA() // implizit inline
        {
          Ainstanz = new A;
          Ainstanz->AnythingA();
        }
    };
    
    A::A()
    {
      Binstanz = new B;
      Binstaz->AnythingB();
    }
    


  • Tim06TR schrieb:

    d.h. Ich muss sie in 2 header, mit includeguards tun ?

    Lies am besten mal das.



  • Tim06TR schrieb:

    Ok ich hab was vergessen:

    class B;
    
    class A
    {
      public:
        void AnythingA();
        B* Binstanz;
        inline void DoB()
        {
          Binstanz = new B;
          Binstaz->AnythingB();
        }
    };
    
    class B
    {
      public:
        void AnythingB();
        A* Ainstanz;
        inline void DoA()
        {
          Ainstanz = new A;
          Ainstanz->AnythingA(); 
        }
    };
    
    // fwd declarations
    
    class A; // für A nicht nötig, schadet aber auch nicht
    class B; // für B sehr wohl nötig
    
    // class definitions
    
    class A
    {
      public:
        void AnythingA();
        B* Binstanz;
        void DoB();
    };
    
    class B
    {
      public:
        void AnythingB();
        A* Ainstanz;
        void DoA();
    };
    
    // inline functions
    
    inline void A::DoB()
    {
      Binstanz = new B;
      Binstaz->AnythingB();
    }
    
    inline void B::DoA()
    {
      Ainstanz = new A;
      Ainstanz->AnythingA(); 
    }
    

    Hat sowas eigentlich ein Namen ?

    Zyklische Abhängigkeit (cyclic dependency) bzw. auch Zirkuläre Abhängigkeit (circular dependency).

    Im Deutschen ist Zyklische Abhängigkeit gebräuchlicher, im Englischen eher circular dependency.



  • Das ich darauf nicht selbst gekommen bin 😮



  • Tim06TR schrieb:

    Das ich darauf nicht selbst gekommen bin 😮

    Würde auch in dem von mir gepostetem Link stehen..


Anmelden zum Antworten