2010-02-28 4 views
5

Ich bin ein wenig verwirrt darüber, wie die Stream-Operatoren für meine Klasse in C++ überladen werden, da es scheint, dass sie Funktionen in den Stream-Klassen sind, nicht in meiner Klasse. Was ist der normale Weg, dies zu tun? Im Moment, für den "bekommen von" Operator, habe ich eine DefinitionWas ist der richtige Weg, um die Stream-Operatoren zu überlasten << >> für meine Klasse?

istream& operator>>(istream& is, Thing& thing) { // etc... 

was funktioniert. Es ist nicht in der Definition der Ding-Klasse erwähnt. Ich möchte, dass es in seiner Implementierung auf Mitglieder meiner Klasse Thing zugreifen kann - wie mache ich das?

Antwort

9

Ihre Implementierung ist in Ordnung. Der einzige zusätzliche Schritt, den Sie ausführen müssen, ist Ihre Betreiber als friend in Thing zu erklären:

class Thing { 
public: 
    friend istream& operator>>(istream&, Thing&); 
    ... 
} 
+0

Danke. Was bedeutet es, dass es nicht in einem "public:" Abschnitt ist? – ghallio

6

Sie machen Ihre operator>> einen Freund der Klasse Thing.

8

Die anderen Antworten richtig sind. Für den Fall, es hilft Ihnen, hier ist ein Codebeispiel (source):

class MyClass { 
    int x, y; 
public: 
    MyClass(int i, int j) { 
    x = i; 
    y = j; 
    } 
    friend ostream &operator<<(ostream &stream, MyClass ob); 
    friend istream &operator>>(istream &stream, MyClass &ob); 
}; 

ostream &operator<<(ostream &stream, MyClass ob) 
{ 
    stream << ob.x << ' ' << ob.y << '\n'; 

    return stream; 
} 

istream &operator>>(istream &stream, MyClass &ob) 
{ 
    stream >> ob.x >> ob.y; 

    return stream; 
} 
+2

Ich würde Operator << wie folgt definieren: ostream & operator << (ostream & stream, const MyClass & ob); –

2

Es gibt mehrere Ansätze und die richtige hängt wirklich davon ab, was die Klasse tut.

Oft ist es sinnvoll, über eine öffentliche API zu verfügen, die das Lesen der Informationen ermöglicht. In diesem Fall müssen die Streaming-Operatoren nicht auf private Daten zugreifen.

Wahrscheinlich ist der beliebteste Ansatz, die Streaming-Funktionen Freunde der Klasse zu deklarieren.

Mein Favorit ist die Bereitstellung einer öffentlichen Boost.Serialization-Stil-Vorlage-Funktion, die für das Streaming in beide Richtungen verwendet werden kann, sowie für andere Dinge.

Verwandte Themen