Referenzen



  • 1. Warum kann man keinen vector mit Referenzen erstellen?

    std::vector<int&> v;
    

    2. Sind casts auf Referenzen so OK?

    class foo{
    public:
    	virtual void m(){std::cout<<"foo";};
    };
    
    class bar : public foo{
    public:
    	virtual void m(){std::cout<<"bar";};
    };
    
    void bla(bar& b)
    {
    	b.m();
    }
    
    int main()
    {
    	foo f;
    	bar b;
    	foo& f2 = b;
    	bla(dynamic_cast<bar&>(f2));
    }
    


    1. weil die Elemente im vector kopierbar sein müssen, und Referenzen sind nicht kopierbar. Du kannst stattdessen Zeiger nehmen. (oder gleich boost PtrContainer)
    2. ja, solltest nur beachten dass das Ding eine std::bad_cast-Exception werfen kann, wenn der cast fehlschlägt. Aber warum veränderst du die Funktion nicht so, dass gleich die Basisklasse als Parameter akzeptiert wird? Du rufst ja nur die virtuelle Funktion auf. Für sowas ist ja Polymorphie gedacht.


  • refer schrieb:

    1. Warum kann man keinen vector mit Referenzen erstellen?

    std::vector<int&> v;
    

    Ganz einfach: Referenzen sind keine "Objekttypen". Sie erfüllen nicht die Bedingungen der Standardcontainer

    refer schrieb:

    2. Sind casts auf Referenzen so OK?

    class foo { ... virtual ... };
    
    class bar : public foo { ... };
    
    void bla(bar& b);
    
    int main()
    {
    	foo f;
    	bar b;
    	foo& f2 = b;
    	bla(dynamic_cast<bar&>(f2));
    }
    

    Das müsste so gehen, ja. Sollte aber vermieden werden. Bedenke, dass dynamic_cast in so einem Fall (Referenzen) ggf eine bad_cast-Ausnahme wirft, wobei dynamic_cast<bar*>(&f2) ggf einfach einen Nullzeiger zurückgibt, falls f2 doch kein bar-Objekt war.

    kk


Anmelden zum Antworten