2010-12-03 37 views
5

Um cout als solches zu verwenden: std :: cout < < myObject, warum muss ich ein Ostream-Objekt übergeben? Ich dachte, das wäre ein impliziter Parameter.operator << overloading ostream

ostream &operator<<(ostream &out, const myClass &o) { 

    out << o.fname << " " << o.lname; 
    return out; 
} 

Dank

Antwort

5

Sie fügen es kein anderes Mitglied Funktion ostream, da diese die Klasse neu definiert erfordern würde. Sie können es nicht zu myClass hinzufügen, da die ostream zuerst geht. Das einzige, was Sie tun können, ist eine Überladung zu einer unabhängigen Funktion hinzuzufügen, was Sie im Beispiel tun.

+0

+1 für einen guten Abzug über das, was in der Frage ungesagt wurde –

-1

Weil Sie eine freie Funktion überladen, keine Mitgliedsfunktion.

2

Nur wenn es eine Memberfunktion der Klasse ist, die andernfalls das erste Argument wäre. So wäre es:

class ostream { 
    ... 
    ostream &operator << (const myClass &o); 
    ... 
}; 

Seit ostream geschrieben wurde lange vor Ihrer Klasse finden Sie das Problem Ihre Klasse in dorthin zu gelangen. Daher müssen wir die Bediener als freistehende Funktion implementieren:

(return type) operator << ((left hand side), (right hand side)); 

Wenn Betreiber als Mitglied-Funktionen von Klassen implementiert werden, die linke Seite ist this, und das Argument wird die rechte Seite. (Für binäre Operatoren - unäre Operatoren funktionieren ähnlich.)

Verwandte Themen