Frage zu l-value



  • Ich habe mir gerade den Abschnitt zu Vector-Klasse von volkard Tuts[*] druchgelesen. Den Abschnitt mit dem l-vlaue verstehe ich nicht ganz.

    Wenn ich in einer Vektor-Klassen den Index-Operstor so überlade,

    double operator[](int index)
       {
          return m_data[index];
       };
    

    dann kann ich solch eine Zuweisung nicht machen.

    m_data[index]=5;
    

    Wenn ich allerdings den Rückgabetyp auf eine Referenz ändere, dann geht die obrige Zuweisung.

    double& operator[](int index)
       {
          return m_data[index];
       };
    

    In Volkards Text wurde dies so begründet:

    Sie können die Rückgabe einer Funktion aber zu einem L-Wert machen, indem Sie einfach eine Referenz auf einen L-Wert übergeben.

    Wie, "in dem sie eine Referenz übergeben"? Wo übergebe ich denn eine Referenz wenn ich einen Rückgabetyp ändere? Dieser Satz hat mich dann völlig aus der Bahn geworfen. Wo bitte ist denn hier eine Rückgabe einer Funktion?

    m_data[index]=5;
    

    Es wäre nett, wenn mir das noch mal jemand für Dumme, so wie ich es bin, erklären könnte. Da passiert anscheinend mehr im Hintergund als ich auf einen Blick sehe.

    * = http://www.tbi.univie.ac.at/~pmg/tutorials/tmp/vcppk/html/die_klasse_vector.html



  • CppLerner schrieb:

    Wenn ich allerdings den Rückgabetyp auf eine Referenz ändere, dann geht die obrige Zuweisung.

    double& operator[](int index)
       {
          return m_data[index];
       };
    

    Wie, "in dem sie eine Referenz übergeben"? Wo übergebe ich denn eine Referenz wenn ich einen Rückgabetyp ändere? Dieser Satz hat mich dann völlig aus der Bahn geworfen. Wo bitte ist denn hier eine Rückgabe einer Funktion?

    m_data[index]=5;
    

    http://www.tbi.univie.ac.at/~pmg/tutorials/tmp/vcppk/html/die_klasse_vector.html

    Hi, du hast es doch selber gesagt. Du änderst den Rückgabewert auf reference.
    Du überlädst den Operator, das ist eine Funktion.
    Diese Funktion wird immer ausgeführt, wenn die Parameter deines überladenen Operators Matchen und du den Operator hinschreibst.

    Edit:

    data_[index] = 5;
    

    Macht folgendes:
    1. es wird eine Funktion aufgerufen der eine Zahl als Parameter übergeben wird.
    2. Die Zahl wird benutzt um zu der Position innerhalb des Vectors zu springen.
    3. Die Funktion returned eine reference auf den Wert der an der Position der Zahl stand.
    4. du weist dieser reference dann den Wert 5 zu. (Du änderst also den Wert innerhalb des vectors.)

    Und das alles passiert dank Operator overloading nur durch "[]" .
    War das verständlich?



  • chp++ schrieb:

    4. du weist dieser reference dann den Wert 5 zu. (Du änderst also den Wert innerhalb des vectors.)

    Vielen Dank, genau dieser Punkt war mir nicht klar. Danke, dass du den Knoten im Hirn gelöst hast. Ich gehöre leider nicht zu den intelligenten Menschen mit Abi oder gar Studium, da muss ich oft nachfragen, bis wirklich alles klar ist.



  • CppLerner schrieb:

    Ich gehöre leider nicht zu den intelligenten Menschen mit Abi oder gar Studium, da muss ich oft nachfragen, bis wirklich alles klar ist.

    Das hat damit nichts zu tun.
    Ich kenne Programmierer die nur Realabschluss haben und Programmierer mit Dr. Titel und es sagt überhaupt nichts darüber aus wie gut jemand in einer Programmiersprache ist.

    Letztlich ist es wichtig, dass du dich für das Thema interessierst oder gar dafür "brennst" und in C++ ist es vor allem wichtig sich dafür zu interessieren was intern passiert.

    Es gibt Leute die machen den Job als Programmierer, weil sie damit ihre Brötchen verdienen und es gibt Leute die haben ihr Hobby zum Beruf gemacht und das sagt viel mehr über die Motivation aus sich mit einem bestimmten Thema zu beschäftigen und dann auch wie gut man letztlich werden kann.

    Und lieber einmal mehr gefragt als einmal zu wenig.



  • Danke, das baut mich auf. Ja, ich bin heiß C++ zu lernen und zwar richtig und wenn ich mir hundertmal was über l- und r-value reinziehen muss. Ich will es verstehen und das zu 100% und nicht nur wischiwaschi.


Log in to reply