Anfängerfrage zu Vererbung



  • Hallo, ich habe ein Problem bei zwei Klassen, die jeweils von einander erben sollen.

    class A
    {
       private:
        int a;
    
       public:
        friend class B;
        void funktion1(B& objekt);
    };
    
    class B : A
    {
       private:
        int b;
    
       public:
        void funktion2(A& Objekt)
        {
            Objekt.a=1;
        }
    };
    

    Wie hier zu sehen ist, gibt es in Klasse A eine Funktion, die ein Objekt der Klasse B als Parameter hat und eine Klasse B, die ein Objekt der Klasse A als Paramter hat. Das Beispiel von oben kompiliert auch wunderbar.
    Wenn ich jetzt über Funktion1 auf B zugreifen will,

    void funktion1(B& objekt)
    {
        objekt.b=1;
    }
    

    dann bekomme ich eine Fehlermeldung (Invalid Use of undefinded type B, Forward declaration of B).
    Wie kann ich die Klassen so voneinander erben lassen, dass ich ein Objekt einer Klasse als Parameter in Funktionen der jeweils anderen Klasse benutzen kann, und noch Zugriffsrechte auf das Objekt habe?



  • zur deklarationszeit von Klasse A ist Klasse B noch nicht bekannt.

    setz mal ganz an den Anfang ein:

    class B;  // Macht Klasse 'B' bekannt
    
    class A {
    // ...
    };
    
    // ...
    


  • Wenn ich das so ändere:

    class A;
    
    class B : A
    {
        private: int b;
        public: void func(const A& obj);
    };
    
    class A : B
    {
        public: int a;
        public: void func2(const B& obj);
    };
    
    void B::func(const A& obj)
    {
        b=obj.a;
    }
    
    void A::func2(const B& obj)
    {
        a=obj.b;
    }
    

    Bekomme ich als Fehlermeldung:
    Invalid use of undefinded type 'struct A' zu Zeile 4 und forward declaration of 'struct A' zu Zeile 1.



  • Wie willst du A von B erben und gleichzeitig B von A ?



  • Also ist es unmöglich in Klasse A eine Funktion zu implemetieren, die ein Objekt von Klasse B als Parameter nutzt und gleichzeitig eine Funktion in Klasse B zu implementieren, die als Parameter ein Objekt von Klasse A nutzt?



  • Nein, das Problem ist die Vererbung. A erbt von B, B von A, A von B, B von A... Du hast ein dickes Design-Problem. Aber das sagte Nexus ja bereits.



  • Was wäre denn der richtige Ansatz, damit meine Implementation klappt?



  • Also bei mir läßt sich folgendes kompilieren:

    class A
    {
       private:
        int a;
    
       public:
        friend class B;
        void funktion1(B& objekt);
    };
    
    class B : A
    {
       private:
        friend class A;
        int b;
    
       public:
        void funktion2(A& Objekt)
        {
            Objekt.a=1;
        }
    };
    
    void A::funktion1(B& objekt)
    {
    	objekt.b = 1;
    }
    

    Da B.b private ist, muß Klasse A allerdings noch friend von B sein.



  • Das hat funktioniert, Danke!


Log in to reply