2010-02-28 21 views
5

Estoy un poco confundido acerca de cómo sobrecargar los operadores de flujo de mi clase en C++, ya que parece que son funciones en las clases de flujo, no en mi clase. ¿Cuál es la forma normal de hacer esto? En este momento, para el operador "get from", tengo una definición¿Cuál es la forma correcta de sobrecargar los operadores de flujo << >> para mi clase?

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

que funciona. No se menciona en la definición de la clase de Cosa. Quiero que pueda acceder a los miembros de mi clase Thing en su implementación, ¿cómo puedo hacer esto?

Respuesta

9

Su implementación está bien. El único paso adicional que necesita para llevar a cabo es declarar su operador como friend en Thing:

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

Gracias. ¿Qué significa que no está en una sección "pública"? – ghallio

6

Usted hace que su operator>> sea un amigo de la clase Cosa.

8

Las otras respuestas son correctas. En caso de que te ayuda, aquí hay un ejemplo de código (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

Definiría el operador << de la siguiente manera: ostream & operator << (ostream & stream, const MyClass & ob); –

2

Existen varios enfoques y el más adecuado depende realmente de lo que haga la clase.

A menudo tiene sentido tener una API pública que permita leer la información, en cuyo caso los operadores de transmisión no necesitan acceder a las partes privadas.

Probablemente el enfoque más popular es declarar las funciones de transmisión amigos de la clase.

Mi favorito es proporcionar una función pública de plantilla de estilo de Boost.Serialization que se puede utilizar para la transmisión de cualquier manera, así como para otras cosas.

Cuestiones relacionadas