Das Problem mit dieser Konfiguration ist, dass der oben definierte Operator < < eine freie Funktion ist, die nicht virtuell sein kann (sie hat kein Empfängerobjekt). Um die Funktion virtuell zu machen, muss sie als Mitglied einer Klasse definiert werden, was hier problematisch ist, weil, wenn Sie den Operator < < als Mitglied einer Klasse definieren, die Operanden in der falschen Reihenfolge stehen:
bedeutet, dass
MyClass myObject;
cout << myObject;
wird nicht kompiliert, sondern
MyClass myObject;
myObject << cout;
wird legal.
Um dies zu beheben, können Sie das Fundamental Theorem der Software Engineering anwenden - jedes Problem kann durch Hinzufügen einer anderen Ebene der Indirektion gelöst werden. Anstatt Betreiber machen < < virtuell, sollten Sie erwägen, eine neue virtuelle Funktion in die Klasse, die wie folgt aussieht:
class MyClass {
public:
virtual void print(ostream& where) const;
};
Dann definieren Operator < < als
ostream& operator<< (ostream& out, const MyClass& mc) {
mc.print(out);
return out;
}
diese Weise kann der Bediener < < Die freie Funktion hat die richtige Parameterreihenfolge, aber das Verhalten des Operators < < kann in Unterklassen angepasst werden.
Hoffe, das hilft!
danke es ist sehr hilfreich. Ich dachte über diese Lösung nach, aber ich dachte, dass es vielleicht einen anderen Weg gibt, den ich nicht so einfach für die Implementierung kenne. –
* "jedes Problem kann durch Hinzufügen einer anderen Ebene der Indirektion gelöst werden" * - denken Sie daran, jedes Problem mit Ausnahme des Problems von zu vielen Ebenen der Indirektion;) – Kos
@Kos: Nein, nein. Solange Sie es als "unsigned indirection;" deklariert haben, müssen Sie immer mehr und mehr Indirection hinzufügen und das Problem wird sich lösen, wenn Sie über –