Template: Set-Funktion hat keinen Effekt auf Referenz



  • Also, ich hab ein Template, welches eine Referenz beinhaltet,
    und auch eine SetFunktion für diese.

    Und da wird eine Zuweisung einfach ignoriert. Ich kanns nachprüfen,
    sie findet offensichtlich nicht statt:

    #ifndef guest_h
    #define guest_h
    #include <iostream>
    namespace CMOUTPUT
    {
    
    template<class T>
    class guest
    {
    protected:
    	T& output_obj;
    public:
    	guest(T& t);
    	virtual ~guest();
    	guest(const guest<T>& copy);
    	guest<T>& operator=(const guest<T>& copy);
    	T& Getoutput_obj();
    	void Setoutput_obj(T& Output_obj){output_obj = Output_obj;std::cout << "SETOUTPUT" << Output_obj.Getname() << " " << Getoutput_obj().Getname() << std::endl;}
    };
    
    #include "guest.hpp"
    
    template<class T>
    guest<T>::guest(T& t):output_obj(t)
    {
    
    }
    
    template<class T>
    guest<T>::~guest()
    {
    
    }
    
    template<class T>
    guest<T>::guest(const guest<T>& copy):output_obj(copy.output_obj)
    {
    
    }
    
    template<class T>
    guest<T>& guest<T>::operator=(const guest<T>& copy)
    {
    	output_obj = copy.output_obj;
    	return *this;
    }
    
    template<class T>
    T& guest<T>::Getoutput_obj()
    {
    	return output_obj;
    }
    
    /*template<class T>
    void guest<T>::Setoutput_obj(T& Output_obj)
    {
    	output_obj=Output_obj;
    	std::cout << "SETOUTPUT" << Output_obj.Getname() << " " << output_obj.Getname() << std::endl;//ergibt "SETOUTPUTende begin"
    }*/
    
    }
    #endif
    

    Von diesem Template leite ich dann Klassen entsprechend ab.
    Dort wird Setoutput_obj aufgerufen, und offensichtlich die Zuweisung
    ignoriert. Anders kann ich mir das nicht erklären...

    Jemand eine Idee ?

    phlox



  • Naja das kommt wohl auf den Zuweisungsoperator von T an, denn der wird ja aufgerufen. Poste den doch mal.



  • 7H3 N4C3R schrieb:

    Naja das kommt wohl auf den Zuweisungsoperator von T an, denn der wird ja aufgerufen. Poste den doch mal.

    ähm, das ist ne referenz... 🙄
    Der sollte da keine Rolle spielen. Oder doch ?

    Vielleicht liegts auch daran, das heute Halloween ist, und es auf meinem PC spukt *muhaha*



  • Ist das jetzt ein Halloween-Scherz? *gg*

    Referenzen können nur initialisiert aber nicht zugewiesen werden.

    Steht auf der linken Seite des Zuweisungsoperators eine Referenz, so wird die Zuweisung auf das Objekt durchgeführt, auf das die Referenz zeigt.



  • 7H3 N4C3R schrieb:

    Ist das jetzt ein Halloween-Scherz? *gg*

    Referenzen können nur initialisiert aber nicht zugewiesen werden.

    Steht auf der linken Seite des Zuweisungsoperators eine Referenz, so wird die Zuweisung auf das Objekt durchgeführt, auf das die Referenz zeigt.

    Nein, ist kein Scherz.
    Also, kann ich eine referenz garnicht zuweisen ?
    Das wäre mir aber neu ⚠



  • Was macht wohl ?

    int x = 1;
    int& ref = x;
    ref = 5;
    

    Das erste = initialisiert die Referenz und das zweite gleich weisst dem x den Wert 5 zu (weil ref x referenziert).



  • niemand schrieb:

    Was macht wohl ?

    int x = 1;
    int& ref = x;
    ref = 5;
    

    Das erste = initialisiert die Referenz und das zweite gleich weisst dem x den Wert 5 zu (weil ref x referenziert).

    danke aber ich kenne Referenzen 🙄
    Das man sie (angeblich) aber nicht wieder neu zuweisen kann, ist mir neu.



  • Eine Referenz bezieht sich Zeit ihres Lebens auf dieselbe Variable, zuweisungen an andere variablen kopieren nur deren Wert in die zugehörige Variable:

    int a=3;
    int b=5;
    int& ref=a; //ref bezieht sich jetzt immer auf a!!
    ref = b; //weist ref (also damit a) den Wert von b zu => a = 5
             //verknüpft ref aber NICHT mit b!
    ref = 7; // b ist also immernoch 5, a ist jetzt 7...
    


  • Das man sie (angeblich) aber nicht wieder neu zuweisen kann, ist mir neu.

    Nix mit angeblich, mit Sicherheit kann man Referenzen nur initialisieren.



  • phlox81 schrieb:

    danke aber ich kenne Referenzen 🙄

    Offensichtlich nicht. Eine Zuweisung an eine Referenz bewirkt eine Zuweisung an das Objekt, mit dem die Referenz initialisiert wurde. "Umbiegen" kannst du nur Zeiger.



  • Hier auch nochmal das Quote aus dem Standard (5.17, Clause 6):

    When the left operand of an assignment operator denotes a reference to T, the operation assigns to the
    object of type T denoted by the reference.



  • [quote="phlox81"]

    niemand schrieb:

    Was macht wohl ?
    danke aber ich kenne Referenzen 🙄
    Das man sie (angeblich) aber nicht wieder neu zuweisen kann, ist mir neu.

    Sorry, aber ich hatte genau angenommen, dass Du Referenzen im Prinzip kennst. Obiger Code sollte Dir nur vor Augen führen, dass eine Zuweisung auf eine Referenz eben den Inhalt der referenzierten Variable ändert. Hätte ich nicht angenommen, dass Dir das eigentlich klar, hätte ich es kommentiert 😉



  • phlox81 is'n troll...


Anmelden zum Antworten