Einige Fragen zu Referenzen



  • Hallo,

    Ich habe einige Fragen zu Referenzen und hoffe jemand kann mir diese beantworten 🙂

    In Bezug auf getter-Methoden mal ein Beispiel:
    Ich habe eine"Info" Klasse die ein ein Objekt der Klasse State besitzt, welches abgefragt werden kann;

    class State;
    
    class Info
    {
    ...
    const State& getState1() { return m_state; }
    State getState2() { return m_state; }
    ...
    private:
    State m_state;
    };
    
    ...
    int main()
    {
       ...
       State state1 = rInfo.getState1();  // state1 wird erzeugt und der Zuweisungsoperator von State ausgeführt (?), ich kann state1 auch verändern
       State& state2 = rInfo.getState1();  // error weil nicht const
       const State& state3 = rInfo.getState1()  // es wird kein Objekt erzeugt, ich kann state3 nicht verändern
    
       State state4 = rInfo.getState2();  // genau gleich wie bei state1?
       State& state5 = rInfo.getState2(); // ?
       ...
    }
    

    Ich habe leder nirgends Infos dazu gefunden (wusste auch nicht wie danach suchen)...

    Danke für jede Antwort!



  • Hier Lektion 36 und 37 behandelt referenzen.



  • Hallo,

    dabei geht es aber nur um Referenzen als Argumente (Call by Reference) und nie um Referenzen als Rückgabewert, also meine konkreten Fragen kann ich damit nicht beantworten.



  • OK, naja das ist im Grunde alles Ähnlich, das Referenzbeispiel erklärt genau was du meinst, abe rich schreib dir mal Kommentare.

    State state1 = rInfo.getState1();  // das ist eine Kopie vom zurückgegebenen m_state
       State& state2 = rInfo.getState1();  // das ist eine Referenz auf das Original m_state, mit dieser Referenz könntest du m_state verädnern, da die zuweisung aber const ist geht das nicht
       const State& state3 = rInfo.getState1()  //da weis ich nicht 100%ig bescheid
    
       State state4 = rInfo.getState2();  // wieder eine Kopie von m_state
       State& state5 = rInfo.getState2(); // eine referenz auf m_state über die du m_state direkt manipulieren kannst
    


  • Danke nochmals für deinen Beitrag

    const State& state3 = rInfo.getState1()  //da weis ich nicht 100%ig bescheid
    

    Na ich denke dies ist doch der Normalfall für ein getter-Methode wenn ich nur lesend darauf zugreifen möchte (das Objekt der Info-Klasse kann nicht verändert werden und es muss kein temporäres Objekt zusätzlich erzeugt werden)

    State& state5 = rInfo.getState2(); // eine referenz auf m_state über die du m_state direkt manipulieren kannst
    

    Dann ist die Variante getState2() für eine getter-Methode also falsch, da der Benutzer der Info Klasse nun den Zustand des Info-Objekts manipulieren kann (was ja nicht der Sinn der Sache ist, es ist ja eben keine set-Methode)



  • Xebov schrieb:

    OK, naja das ist im Grunde alles Ähnlich, das Referenzbeispiel erklärt genau was du meinst, abe rich schreib dir mal Kommentare.

    Zum Teil leider falsche Kommentare, ich korrigier mal:

    State state1 = rInfo.getState1();  
    /* state1 ist ein neues State-Objekt und wird mit der Referenz auf m_state initialisiert, das ist ok genau dann wenn State einen Copy-Ctor hat
    (wenn der nicht grade eine non-const referenz als argument hat), z.B. vom compiler generierter copy-ctor */
       State& state2 = rInfo.getState1();  
    /* wie vom OP bemerkt ein Fehler, eine nicht-konstante referenz kann nicht an eine const referenz gebunden werden */
       const State& state3 = rInfo.getState1()  
    /* state3 verweist auf m_state, const ref an const ref zu binden ist das was am offensichtlichsten funktioniert */
    
       State state4 = rInfo.getState2();  
    /* wieder eine Kopie von m_state, im Grunde sogar eine Kopie von der Kopie: getState2 liefert eine Kopie, state4 wird mittels copy-Ctor
    mit dieser Kopie initialisiert. die 2te Kopie wird vom Compiler meist wegoptimiert */
       State& state5 = rInfo.getState2(); 
    /* die referenz state5 wird an das temporäre Objekt gebunden, das von getState2 übergeben wird, FEHLER! */
      const State& state6 = rInfo.getState2(); 
    /* die konstante referenz state6 wird an das temporäre Objekt gebunden, das von getState2 übergeben wird, das ist KEIN Fehler: 
    const-referenzen auf temporäre Objekte halten diese am Leben, bis die Referenz verschwindet, siehe
    http://herbsutter.wordpress.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ */
    


  • Vielen Dank pumuckl, das hilft mir sehr! 👍


Anmelden zum Antworten