2010-02-28 11 views
5

Sono un po 'confuso su come sovraccaricare gli operatori di streaming per la mia classe in C++, poiché sembra che siano funzioni nelle classi di flusso, non nella mia classe. Qual è il modo normale per farlo? Al momento, per l'operatore "get from", ho una definizioneQual è il modo giusto per sovraccaricare gli operatori di streaming << >> per la mia classe?

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

che funziona. Non è menzionato nella definizione della classe Thing. Voglio che sia in grado di accedere ai membri della mia classe Thing nella sua implementazione - come faccio?

risposta

9

L'implementazione è soddisfacente. L'unico passaggio aggiuntivo è necessario eseguire è quello di dichiarare il proprio operatore come friend in Thing:

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

Grazie. Cosa significa che non è in una sezione "pubblica:"? – ghallio

6

Fai del tuo operator>> un amico della classe Thing.

8

Le altre risposte sono giuste. Nel caso in cui si aiuta, ecco un esempio di codice (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

Definirei l'operatore << come segue: ostream & operator << (ostream & stream, const MyClass & ob); –

2

ci sono diversi approcci e quello di destra in realtà dipende da ciò che la classe fa.

Molto spesso è logico disporre di API pubbliche che consentano la lettura delle informazioni, nel qual caso gli operatori di streaming non devono accedere ai dati privati.

Probabilmente l'approccio più popolare è la dichiarazione delle funzioni di streaming degli amici della classe.

Il mio preferito sta fornendo una funzione di modello di stile Boost.Serialization pubblica che può essere utilizzata per lo streaming in entrambi i modi, nonché per altre cose.

Problemi correlati