Pointer und Klassen-Rückgabewerte



  • Wer kann mir folgenden Zusammenhang erklären:

    class A
    {
    };
    
    A& A::Method()
    
    A* A::Method2()
    

    Was genau bewirken Referenzen und Pointer der Klasse?
    Danke.



  • Das sind Rückgabewerte von Methoden der Klasse A.

    Method gibt eine A-Referenz zurück.
    Method2 gibt einen A-Pointer zurück.

    ~Edit: Italic Tags~



  • Was bedeutet eine A-Referenz genau? Eine Referenz auf die Klasse A?
    Wozu dient das in der Praxis?

    Wie müssen die return-Werte in der Methode aussehen?



  • Sunset schrieb:

    Was bedeutet eine A-Referenz genau? Eine Referenz auf die Klasse A?

    Mit A-Referenz meine eine Referenz auf eine Instanz einer A-Klasse:

    class A{ ... };
    
    A meineAInstanz;
    A &meineAReferenz = meineAInstanz;
    

    Sunset schrieb:

    Wozu dient das in der Praxis?

    Referenzen generell oder die Methoden? Bei Methoden siehe unten.

    Sunset schrieb:

    Wie müssen die return-Werte in der Methode aussehen?

    A& A::Method()
    {
        return *this; // Gibt die aktualle Instaz als Referenz zurück,
                      // dammit kann man z.B. Methodenaufrufe verketten.
                      // Siehe unten.
        // Oder:
        static A globaleAInstanz; // So kann man z.B Singletons erzeugen.
        return globaleAInstanz;
    }
    
    A* A::Method()
    {
        return this;  // Das gleiche wie bei der Referenz-Version,
                      // nur eben als Pointer.
    
        // Oder:
        return new A;
    
        // Oder:
        static A globaleAInstanz; // Das gleiche wie bei der Referenz-Version,
        return &globaleAInstanz;  // nur eben als Pointer.
    }
    

    So könnte man dann die Methoden verkettet aufrufen:

    A meinA;
    meinA.Method().Method().Method(); // Usw...
    // Ist das gleiche wie:
    A meinA;
    meinA.Method();
    meinA.Method();
    meinA.Method();
    // Usw ...
    


  • Sunset schrieb:

    Was bedeutet eine A-Referenz genau? Eine Referenz auf die Klasse A?

    Eine Referenz auf eine Instanz der Klasse A.

    Sunset schrieb:

    Wozu dient das in der Praxis?

    u.a.

    * Vermeidung von teuren Kopien (A A::Method())
    * Öffnung der Schnittstelle zur direkten Manipulation von Klassenmembern
    * Bei Eigenverweisen: Möglichkeit der Verkettung, bspw. my_a.Method().Method().Method();

    Sunset schrieb:

    Wie müssen die return-Werte in der Methode aussehen?

    Kommt drauf an, was die Methode machen soll. Wenn es sich um Eigenverweise handeln soll, dann

    A& A::Method()
    {
      return *this;
    }
    
    A* A::Method()
    {
      return this;
    }
    

Log in to reply