Chris Codeblog

Tipps, Tricks & Tutorials rund ums Programmieren

[C++] Method Chaining

Was ist Method Chaining?

Wie der Name schon sagt, können beim Method Chaining Methoden einer Klasse hintereinander aufgerufen werden. Dabei gibt jede Funktion, für die das funktionieren soll, eine Referenz der eigenen Instanz zurück.

Die Verwendung einer solchen Klasse sieht dann z. B. so aus:

Person p{};
p.SetVorname("Max").SetNachname("Mustermann");

Zuerst wird eine Instanz der Klasse erzeugt. Dann wird mit den Funktionen SetVorname und SetNachname die jeweilige Eigenschaft der Klasse gesetzt.

Das gesamte Beispiel sieht so aus (der Code kann z. B. einfach in https://wandbox.org ausprobiert werden):

#include <iostream>
#include <string>

class Person
{
    private:
        std::string vorname_{};
        std::string nachname_{};

    public:
        Person& SetVorname(const std::string& vorname) 
        {
            this->vorname_ = vorname;
            return *this;
        }

        Person& SetNachname(const std::string& nachname)
        {
            this->nachname_ = nachname;
            return *this;
        }

        void Print()
        {
            std::cout << this->vorname_ << " " << this->nachname_ << "\n";
        }
};

int main()
{
    Person p;
    p.SetVorname("Max").SetNachname("Mustermann");
    p.Print();
}

Wieso eine Referenz und nicht die Instanz selbst zurückgeben?

Diese Frage beantwortet sich recht schnell. Wenn einfach nur der this-Pointer zurückgegeben wird, muss bei der anschließenden Verwendung . und -> gemixt werden, was etwas seltsam (und Inkonsistent) wirkt:

Person p;
// p ist kein Pointer, also wird mit "." die erste Funktion aufgerufen. Liefert diese
// den "this"-Pointer zurueck, muss die naechste Funktion mit "->" aufgerufen werden.
p.SetVorname("Max")->SetNachname("Mustermann");

Natürlich kann es auch den umgekehrten Fall geben, wenn Person keine „normale“ Variable sondern ein Pointer ist:

Person *p = std::make_unique_ptr<Person>();
// p ist ein Pointer, also muss die erste Funktion mit "->" aufgerufen werden. Die
// Funktion liefert eine Referenz auf die Instanz zurueck, darum muessen folgende
// Funktionsaufrufe mit "." aufgerufen werden.
p->SetVorname("Max").SetNachname("Mustermann");

Auch hier ist die Verwendung etwas Inkonsistent, allerdings finde ich die Reihenfolge (->, dann .) logischer als anders herum.

[C++] Method Chaining

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen