Elementfunktionen bzw. freie Funktionen



  • Hallo,

    kann mir einer sagen warum es nicht möglich ist die Ausgabe- bzw. Eingabeoperatoren als Elementfunktionen zu überladen?



  • Die Stream-Operatoren (<<, >>) haben zwei Operanden. Den Stream und das Objekt
    das "gestreamt" werden soll. Bei Elementfunktionen sthet jedoch IMMER this,
    also das Objekt, auf der linken Seiten und genau daher geht sowas wie cin >> x
    oder cout << y dann nicht mehr.



  • Das heißt mir bleibt nichts anderes übrig als entweder meine Ausgabe- bzw. Eingabeoperatorenfunktionen als friend zu deklarieren oder aber eine Zugriffsfunktion zu schreiben mit der ich auf die privaten Attribute der Klasse zugreifen kann.

    Was ist denn nun die bessere Variante?



  • Du kannst die Ein-\Ausgabe-Operatoren als Member-Funktionen überladen und diese funktionieren auch. Dies bedeutet jedoch dass die Ein-\Ausgabe-Operatoren abhängig von dem vorne stehenden Objekttyp sind.

    Beispiel:

    a << b
    

    Sind die Operatoren Memberfunktionen funktioniert diese Zeile nur dann wenn in der Klasse des Objekts a ein Operator existiert der mit b etwas anfangen kann.

    b << a
    

    Gleiches gilt für diesen Fall. Funktionieriert nur dann wenn in der Klasse des Objekts b ein Operator überschrieben worden ist, der mit der Klasse von a etwas anfangen kann.

    Um a << b und b << a verwenden zu können benötigt man bei 2 unterschiedlichen Klassen 4 Memberfunktionen um jede Kombination abdecken zu können (a und b vom selben Typ jeweils ein Operator in jeder Klasse, a und b von unterschiedlichem Typ jeweils ein Operator in jeder Klasse).
    Möchte man 3 Klassen verwenden sind es bereits 9 Memberfunktionen.

    Ich denke daran wird deutlich, dass man ziemlich viel zu tun hat wenn man die << >> Operatoren als Member-Funktionen implementieren möchte. 🙂

    Einzige Möglichkeit dieser Falle zu entgehen ist die Friend deklaration. 😞



  • Vielen dank für die ausführliche Antwort


Anmelden zum Antworten