[SOLVED] Referenz umbiegen



  • Hallo zusammen,

    vielleicht stehe ich gerade auf dem Schlauch, aber wie biege ich eigentlich
    eine Referenz um?
    Also ich möchte eine bestehende Referenz ändern, so dass sie auf ein anderes
    Element verweist.

    So klappt es leider nicht 😡

    #include <iostream>
    #include <vector>
    
    class A{
    int a;
    public: A(int a){
                    this->a = a;
            }
    
            void operator=(const A& a){
                    std::cout << "operator= " << a.a << std::endl;
            }
    
    };
    
    int main(){
            A a1(1);
            A a2(2);
            A& aRef(a1);
            aRef = a2;
            aRef = static_cast<A&>(a2);
            return 0;
    }
    

    Gruß,
    CSpille



  • Nexus schrieb:

    Icematix schrieb:

    Ein Zeiger ist im eigentlichen Sinne nichts anderes als eine Referenz, also auch vom Sinn her, das ist eine typische C++-Macke den Unterschied so hervorzuheben, kein anderer Programmierer würde jemals darauf rumreiten wenn jemand einen Zeiger mit Referenz betitelt.

    Nun ja, es gibt schon ein paar nicht unbedeutende Unterschiede.

    • Zeiger sind Objekttypen, Referenzen nicht
    • Zeiger benötigen explizite Dereferenzierung
    • Zeiger können auf Null zeigen
    • Referenzen sind unveränderlich und müssen bei der Definition initialisiert werden
    • Zeiger erlauben Zeigerarithmetik

    Es ist also nur vernünftig, eine klare Grenze zu ziehen.



  • Thank you, darkfate!!!

    Ich war der Meinung ich hätte sie schonmal umgebogen 🙄



  • Wie kommt man eigentlich auf solche Ideen? Alleine schon dass du von "umbiegen" sprichst, sagt doch einiges aus... 😉



  • CSpille schrieb:

    Ich war der Meinung ich hätte sie schonmal umgebogen 🙄

    Dann war das aber weder portabel, noch sicher (dürfte ziemlich undefiniertes Verhalten sein). Ja, es gibt Tricks mit denen so etwas machbar sein kann (wenn man gerne auf Schleudersitzen ohne Fallschirm sitzt).



  • asc schrieb:

    Ja, es gibt Tricks mit denen so etwas machbar sein kann

    Ich wüsste jetzt ernsthaft nicht, wie man sowas anstellen könnte. Eine Referenz kann nach der Initialisierung nicht mehr vom Originalobjekt unterscheiden werden...



  • Nexus schrieb:

    asc schrieb:

    Ja, es gibt Tricks mit denen so etwas machbar sein kann

    Ich wüsste jetzt ernsthaft nicht, wie man sowas anstellen könnte. Eine Referenz kann nach der Initialisierung nicht mehr vom Originalobjekt unterscheiden werden...

    Über einen Hack der Referenzentabelle des Compilers vielleicht?
    Bei sauberem Code ist es absolut unnötig, es sei denn man möchte aus Code Kot machen.



  • Nexus schrieb:

    asc schrieb:

    Ja, es gibt Tricks mit denen so etwas machbar sein kann

    Ich wüsste jetzt ernsthaft nicht, wie man sowas anstellen könnte. Eine Referenz kann nach der Initialisierung nicht mehr vom Originalobjekt unterscheiden werden...

    Es gab hier vor längerer Zeit mal ein Thread, in dem jemand mittels Zeigern und Referenzen entsprechendes gezeigt hatte. Dies ist aber weder portabel noch sinnvoll gewesen. Dies alles fällt unter den Begriff "Dirty Hacks" und sollte nicht verwendet werden (Einfacher aber genauso problematisch ist es, Referenzen auf ungültige Bereiche verweisen zu lassen [Zuweisung über Dereferenzierung eines Zeigers, und löschen des Speicherbereiches]).

    darkfate schrieb:

    Bei sauberem Code ist es absolut unnötig...

    Dem habe ich nie widersprochen.



  • asc schrieb:

    Dem habe ich nie widersprochen.

    Sollte kein Bezug auf deinen Post sein sondern allgemein.

    Wie ist es wenn man eine Referenz auf ein lokales Objekt erstellt. Damit könnte man doch die Lebenszeit des temporären Objektes verlängern bis die Referenz nicht mehr gültig ist oder?



  • darkfate schrieb:

    Wie ist es wenn man eine Referenz auf ein lokales Objekt erstellt. Damit könnte man doch die Lebenszeit des temporären Objektes verlängern bis die Referenz nicht mehr gültig ist oder?

    Jein.
    Wenn ein Objekt aus dem Scope läuft sind alle Referenzen darauf ungültig. Mit der Ausnahme von temporären Objekten, an die eine konstante Referenz gebunden wird. Die verlängert quasi die Lebenszeit des temporären Objekts.

    /edit: Beispiel gelöscht, da falsch...

    siehe auch: http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/


  • Mod

    @pumuckl: ungünstiges Beispiel
    Der Aufruf einer Funktion mit Referenzparameter ändert gerade nichts an der Lebenszeit eines hierfür erzeugten temporären Objekts (12.2/5 Satz 5).



  • camper schrieb:

    @pumuckl: ungünstiges Beispiel
    Der Aufruf einer Funktion mit Referenzparameter ändert gerade nichts an der Lebenszeit eines hierfür erzeugten temporären Objekts (12.2/5 Satz 5).

    Meeh. Sry bin heut nicht auf dem Damm. Ich nehms raus.
    Aber im verlinkten Artikel steht ein passenderes Beispiel 😉


Log in to reply