problem mit "umschlingenden" klassen



  • hi

    hier mal etwas code:

    a.h

    #ifndef A
    #define A
    
    #include "b.h"
    
    class cA
    {
      public: 
            cA(cB *b);
            ~cA(void);
    
      private:
            cB *mb;
    };
    #endif
    

    a.cpp

    #include "a.h"
    
    cA::cA(cB *b): mb(b)
    {
    }
    

    b.h

    #ifndef B
    #define B
    
    #include "a.h"//bei forward deklaration nicht bnötigt
    
    //class cA;//forward deklaration
    
    class cB
    {
      public: 
        cB();
        ~cB(){};
    
      private:
            cA *ma;//hier meckert er, dass er cA nicht kennt
    };
    #endif
    

    b.cpp

    #include "b.h"
    
    //#include "a.h"//bei forward deklaration benötigt
    
    cB::cB()
    {
      ma= new cA(this);
    }
    

    main.cpp

    #include "b.h"
    
    int main()
    {
      cB test;
    
      return 0;
    }
    

    so warum meckert der compiler bei der markierten stelle??

    ich kenne zwei möglichkeiten das zu beheben, nur weiß ich nicht warum das überhaupt nötig ist(nach standard?!)

    1. forward deklaration wie im code angedeutet(whrscheinlich die besste lösung)
    2. ma ist ein void * und wir casten(eher ein böser hack!?)

    gibts noch eine andere BESSERE lösung??

    danke + cu



  • ERROR schrieb:

    so warum meckert der compiler bei der markierten stelle??

    Ich mag wenn leute was selbst lernen. Deswegen versuche mal das selbst logisch zu ergründen. Ein Tipp: Es hat was mit #ifndef A #define A bzw. B zu tun...

    Forward-Deklaration ist imho der beste Weg. Ein anderer der mir gerade einfällt, aber selten sinnvoll ist, ist der dass du für A und B eine gemeinsame Basisklasse verwendest, die in einer separaten Datei ist.

    Was forward-Deklarationen (FD) angeht, sollte sowas auch funktionieren

    class cA
    {
      public:
            cA(cB *b);
            ~cA(void);
    
      private:
            class cB *mb; //<- Siehe hier
    };
    

    Außerdem haben die FDs auch den Vorteil, dass die Header nicht immer geparst werden müssen, wenn die inkludierten verändert wurden. D.h. schnellere Compilierung.



  • ah ja ... ist klar ... durch das #ifndef verhindere ich , dass er die klassendeklaration in die entsprechende andere datei inkludiert ... arg sowas dummes ... danke

    und das mit den Fds in verbindung mit compilierzeit verringern nennt sich doch dann compiler-firerwall oder so??(aus sutters exeptional c++)

    ok danke nochmal ... manchmal sieht man den baum vor lauter wald nicht

    cu

    error

    ps: dein code

    class cA
    {
      public:
            cA(class cB *b);//hier auch noch class!
            ~cA(void);
    
      private:
            class cB *mb; //<- Siehe hier
    };
    

    funktioniert mit der angegebenen ergänzung ... sollte sogar noch etwas besser sein, da die forwarddeklaration nochmals gekapselt wird ...



  • Was hast du denn gegen forward-Deklarationen?

    (Du mußt zumindest den Namen bekanntgeben, bevor du mit einer Klasse arbeitest - also kommst du um FD's nicht herum, wenn zwei Klassen sich gegenseitig benötigen)


Anmelden zum Antworten