Überladung Eingabeoperator Deklaration innerhalb der Klasse? -GELÖST-



  • Angenommen, man möchte den Ein/Ausgabeoperator für eine Klasse überladen,
    macht es Sinn, die Deklaration in der Klasse durchzuführen oder sollte man das ausserhalb der Klasse machen?

    Wenn die Frage nicht verständlich genug ist, kann ich gerne ein Beispiel geben.



  • Innerhalb der Klasse (also als Methode) wird nicht gehen, weil bei solchen Operationen per Konvention das Stream-Objekt auf der linken Seite erwartet wird.

    std::cin >> obj;
    

    kann nur auf zwei Arten funktionieren:

    std::cin.operator>>(obj); // oder
    operator>>(std::cin, obj);
    

    Da du basic_[io]stream nicht ändern kannst, bleibt nur die freie Funktion übrig. Jetzt könnte man die Deklaration zwar per friend in die Klassendeklaration hineinziehen, aber sofern keine guten Gründe bestehen, die Kapselung auf diese Weise aufzubrechen, sollte man von friend eher Abstand nehmen.



  • Also Kapselung aufbrechen ist in diesem Fall etwas krass formuliert finde ich. Es handelt sich dabei ja um genau eine Funktion, die sowieso relativ eng mit der Klasse verbunden ist.

    Ich bin aber aus einem anderen Grund der Meinung, dass friend hier meistens nicht angebracht sein wird:
    Wenn eine Stream-Ausgabe-Funktion etwas ausgeben soll, was nicht (oder nur umständlich) über das öffentliche Interface der Klasse ermittelt werden kann, dann riecht das für mich etwas fischig.
    Es wird Fälle geben wo das OK ist/Sinn macht, aber ich denke es wird eher die Ausnahme bleiben.

    Und so lange man etwas genau so gut ohne friend implementieren kann wie mit, kann man auf das friend wohl auch verzichten.


Anmelden zum Antworten