frage zur forward-deklaration



  • hi,

    ich glaub mir fehlt grad ne gehirnwindung... wieso funktioniert folgendes nicht? ich habe doch extra ne forward-deklaration gemacht um A in B bekannt zu machen. wieso bekomme ich dann als fehler das A undefiniert ist?

    class C
    {
    };
    
    class A;
    
    class B
    {
      public:
    
        B& operator = (const C &rhs) { A a; a(rhs, *this); return *this; }
    };
    
    class A
    {
      public:
    
        void operator () (const C &lhs, B &rhs)
        {
        }
    };
    

    folgendes dagegen funktioniert natürlich, da der operator erst nach der klasse a implementiert wird:

    class C
    {
    };
    
    class B
    {
      public:
    
        B& operator = (const C &rhs);
    };
    
    class A
    {
      public:
    
        void operator () (const C &lhs, B &rhs)
        {
        } 
    };
    
    B& B::operator = (const C &rhs) { A a; a(rhs, *this); return *this; }
    

    danke



  • Forward-Deklarationen kannst du nur verwenden, wenn die Größe (und der Aufbau) der Typen keine Rolle spielt - sprich: bei Pointern oder Referenzen. A::operator() benötigt nur das Wissen, daß es eine Klasse "B" gibt, B::operator= benötigt dagegen den Aufbau der Klasse "A", um compiliert zu werden.



  • allso ich kann es nicht mit sicherheit sagen, da ich mich eigentlich als Laie bezeichne, aber für mich sieht es wie folgt aus:

    Dein Zeiger rhs ist vom Typ B, der ist dem Compiler zu dem Zeitpunkt allerdings noch nicht bekannt, da erst später die Klasse B aufgerufen wird.

    Bitte korregieren falls ich einen Mist erzähle!



  • *LittleT korrigiert* rhs ist vom Typ "const C&" (das ist der Parameter der Funktion) - Probleme bekommt die Forward-Deklaration mit den Anweisungen "A a;" (benötigt die Größe eines A-Objektes) und "a(rhs,*this);" (benötigt die Signatur des A::operator()) - diese beiden Angaben erfährt der Compiler erst viel später (nämlich wenn er die Definition von class A liest).



  • @cstoll

    danke, ist mir jetzt einiges klarer...


Anmelden zum Antworten