invalid initialization of reference



  • Hi,

    ich habe eine Klassenhierarchie, in der jede abgeleitete Klasse eine Variable von einem bestimmten Typ enthält. Diese Typen haben eine gleichartige Klassenhierarchie. Das sieht etwa so aus:

    struct AA {};
    struct BB : public AA {};
    struct CC : public AA {};
    
    class A {
            public:
            virtual AA& getAA() = 0;
    };
    
    class B : public A {
            BB bb;
            public:
            AA& getAA() { return bb; }
    };
    
    class C : public A {
            CC cc;
            vector<CC> ccs;
            public:
            AA& getAA() { return cc; };
    };
    

    Soweit so gut. Leider enthalten die Klassen aber auch noch Vektoren, mit denen ich ähnlich verfahren wollte:

    class A {
            public:
            virtual AA& getAA() = 0;
            virtual vector<AA>& getAAs() = 0;
    };
    
    class B : public A {
            BB bb;
            vector<BB> bbs;
            public:
            AA& getAA() { return bb; }
            vector<AA>& getAAs() { return bbs; } // error!
    };
    
    class C : public A {
            CC cc;
            vector<CC> ccs;
            public:
            AA& getAA() { return cc; };
            vector<AA>& getAAs() {return ccs; }; // error!
    };
    

    Der g++ Compiler antwortet mir:

    invalid initialization of reference of type 'std::vector<A, std::allocator<A> >&' from expression of type 'std::vector<A, std::allocator<A> >'
    

    Kennt jemand eine gute Lösung (ohne Pointer) hierfür?

    Danke!


  • Mod

    _katha schrieb:

    Kennt jemand eine gute Lösung (ohne Pointer) hierfür?

    Wenn du keine Pointer magst, kannst du auch Referenzen oder Iteratoren nehmen. Wobei diese natürlich leicht unterschiedliches leisten als ein Pointer. Jedenfalls musst du die Elemente in den vectoren irgendwie indirekt über ihre Basisklasse (AA) speichern.

    Mit Zeigern (der übliche Ansatz) sähe das so aus:

    class A {
            public:
            virtual AA& getAA() = 0;
            virtual vector<AA*>& getAAs() = 0;
    };
    
    class B : public A {
            BB bb;
            vector<AA*> bbs;
            public:
            AA& getAA() { return bb; }
            vector<AA*>& getAAs() { return bbs; } 
    };
    
    class C : public A {
            CC cc;
            vector<AA*> ccs;
            public:
            AA& getAA() { return cc; };
            vector<AA*>& getAAs() {return ccs; }; 
    };
    

    P.S.: Wobei man dann natürlich auch den vector und die get-Funktion in die Klasse A verfrachten kann.


Anmelden zum Antworten