Klasse braucht Klasse die wiederum die erste Klasse brauch = error C4430, oder ?



  • Moin,
    Ich habe eine Klasse A die eine Instanz erzeugt von einer Klasse B die eine Methode
    enthält die als Parameter ein Object von Typ A hat. Da eine Klasse immer vor der
    anderen kommt weiß anscheinend der Compiler mit dem Namen der anderen Klasse in der
    einen Klasse nichts anzufangen. Ist auch nur eine Vermutung da , wenn ich die
    ensprechenden Methoden entferne, das Compelieren funktioniert.
    Wenn diese Vermutung zutrifft wie umgehe ich das?
    Bei Google & Co...find ich nichts demenstrechendes was zu dem Problem passt und die
    Forum suche ist auch immoment irgentwie...komisch.

    MFG Todd Strasser :xmas1:



  • Morton Rhue schrieb:

    Moin,
    Ich habe eine Klasse A die eine Instanz erzeugt von einer Klasse B

    also

    #ifndef A_HPP
    #define A_HPP
    #include "B.hpp"
    class A{
       B data;
    ...
    };
    #endif
    

    die eine Methode enthält die als Parameter ein Object von Typ A hat.

    reicht referenz auf A?

    #ifndef B_HPP
    #define B_HPP
    class A;
    class B{
       void foo(A& a);
    };
    #include "A.hpp"
    inline void B::foo(A& a){
       a.bar();
    }
    #endif
    


  • Geht ohne Probleme, solange nicht beide Klassen inline sind. Das ist dann z.B. bei 2 Template-Klassen schwierig. Aber sonst, einfach ein

    class A;
    

    vor Klasse B und vice versa. In deiner A.cpp bzw B.cpp beide Header-Dateien einbinden.



  • Vielen Dank!

    MFG Todd Strasser :xmas2:



  • Badestrand schrieb:

    Das ist dann z.B. bei 2 Template-Klassen schwierig.

    Ach, das ist auch nicht wirklich ein Problem - du kannst auch bei Template-Klassen die Implementation auslagern (nicht ganz so weit wie bei normalen Klassen, aber weit genug):

    template<typename T> class A;
    
    template<typename T> class B
    {
    public:
      void setValue(const A<T>& v);
    };
    
    #include "A.HPP"
    
    template<typename T>
    inline void B<T>::setValue(const A<T>& v)
    {...}
    


  • Achso, hey danke!! Werd dann grad mal ein, zwei Sachen bei mir umprogrammieren 😃 👍 :xmas1:


Anmelden zum Antworten