Forward declaration geht nicht



  • Ich habe hier 2 Klassen; A und B, die sich gegenseitig verwenden können sollen.

    class B;
    
    class A
    {
    	friend class B;
    private:
    	B *_pB;
    public:
    	A()
    	{
    	}
    	void SetB(B *pB)
    	{
    		this->_pB->SetNull();
    		this->_pB = pB;
    	}
    	void SetNull()
    	{
    		this->_pB = NULL;
    	}
    };
    
    class B
    {
    	friend class A;
    private:
    	A *_pA;
    public:
    	B()
    	{
    	}
    	void SetA(A *pA)
    	{
    		this->_pA->SetNull();
    		this->_pA = pA;
    	}
    	void SetNull()
    	{
    		this->_pA = NULL;
    	}
    };
    

    Probleme gibt es aber mit den Zeilen 14 und 34.
    Warum kann ich von der jeweils anderen Klasse keine Methoden benutzen?



  • dddaaa schrieb:

    Probleme gibt es aber mit den Zeilen 14 und 34.

    Ist das eigentlich so schwer zu begreifen, dass das keine ausreichende Problembeschreibung ist?



  • dddaaa schrieb:

    Warum kann ich von der jeweils anderen Klasse keine Methoden benutzen?

    Weil eine Forward Declaration dafür nicht ausreicht. Um eine Methode aufzurufen, muss diese zuerst auch mal deklariert sein. D.h.: Du brauchst die vollständige Definition der Klasse. Lösung: Methode außerhalb der Klassendefinition definieren...



  • dddaaa schrieb:

    Ich habe hier 2 Klassen; A und B, die sich gegenseitig verwenden können sollen.

    Hui, ist das einfach. Beide vorwärtsdeklarieren, dann beide definieren und danach für beide die Member-Funktionen definieren. In den Funktionsdefinitionen können beide Klassen dann normal genutzt werden.

    Also

    class A;
    class B;
    
    class A 
    { 
        friend class B; 
    private: 
        B *_pB; 
    public: 
        A();
    
        void SetB(B *pB);
    
        void SetNull();
    }; 
    
    class B 
    { 
        friend class A; 
    private: 
        A *_pA; 
    public: 
        B();
    
        void SetA(A *pA);
    
        void SetNull();
    };
    
    A::A() 
    { 
    } 
    void A::SetB(B *pB) 
    { 
      _pB->SetNull(); 
      _pB = pB; 
    } 
    void A::SetNull() 
    { 
      _pB = NULL; 
    } 
    
    B::B() 
    { 
    } 
    void B::SetA(A *pA) 
    { 
      _pA->SetNull(); 
      _pA = pA; 
    } 
    void B::SetNull() 
    { 
      _pA = NULL; 
    }
    

    Ungetestet (keine Garantie gegen Flüchtigkeitsfehler 😃 )
    this-> hab ich mal weggenommen. Sieht dann weniger kryptisch aus.
    Formatierung ist übrigens auch nicht die hübscheste...



  • Cool funktioniert danke, wieder was gelernt!



  • Und wie mach ich das, wenn ich eine Klasse in jeweils einer Header Datei haben möchte?

    Also z.B. habe ich:

    a.h

    #ifndef A_H
    #define A_H
    
    #include "b.h"
    
    class A 
    { 
    private:
    	B *_pB;
    public:
    	A();
    
    	void SetB(B *pB);
    	void SetNull();
    };
    
    A::A() 
    { 
    }
    
    void A::SetB(B *pB) 
    {
    	_pB->SetNull();
    	_pB = pB;
    }
    void A::SetNull() 
    {
    	_pB = NULL;
    }
    
    B::B() 
    {
    }
    
    #endif
    

    und b.h

    #ifndef B_H
    #define B_H
    
    #include "a.h"
    
    class B
    {
    private:
    	A *_pA;
    public:
    	B();
    
    	void SetA(A *pA);
    	void SetNull();
    };
    
    B::B() 
    {
    }
    
    void B::SetA(A *pA) 
    {
    	_pA->SetNull();
    	_pA = pA;
    }
    void B::SetNull() 
    {
    	_pA = NULL;
    }
    
    #endif
    

    Dann kommt es wieder zum alten Problem.
    Es sei denn, ich erstelle noch eine 3. Header Datei: ab.h

    #ifndef AB_H
    #define AB_H
    
    #include "a.h"
    #include "b.h"
    
    A::A() 
    { 
    }
    
    void A::SetB(B *pB) 
    {
    	_pB->SetNull();
    	_pB = pB;
    }
    void A::SetNull() 
    {
    	_pB = NULL;
    }
    
    B::B() 
    {
    }
    
    void B::SetA(A *pA) 
    {
    	_pA->SetNull();
    	_pA = pA;
    }
    void B::SetNull() 
    {
    	_pA = NULL;
    }
    
    #endif
    

    In dieser sind nun die Methoden der Klassen A und B enthalten und das Programm läuft.

    Ginge das denn auch ohne ab.h?



  • Schon mal was von Header&Source gehört? Ist 'ne ganz tolle Sache.


Anmelden zum Antworten