2010-10-27 21 views
5

Digamos que hago una clase, como, que contiene una matriz de caracteres. Ahora, ¿qué operador se encarga de esto:Pregunta sobre el operador ostream <<

myClass inst; 
cout << inst; 

Al "cout < < inst;" lo que se llama, simplemente por el nombre de la clase? Gracias.

+6

El << operador? – Shog9

+0

Tricky one: D. Me tienes allí :-D. Jaja. Gracias. Así que mi pregunta original es tonta como siempre, ya que no es necesario tener un "valor de retorno" universal, puede definirlo con cada operador, incluido el operador de desplazamiento binario, etc. ... ¿Lo tengo bien? –

+0

Hombre perfecto, gracias. –

Respuesta

12

Lo que se llama es std::ostream &operator<<(std::ostream &, myClass const &). Puede sobrecargar esto si lo desea.

2

El compilador buscará una sobrecarga de operator<<. En particular, se verá ya sea para una sobrecarga función miembro de std::ostream (no existe), o una función libre, que se debe sobrecargar con el siguiente prototipo:

std::ostream &operator<< (std::ostream &os, const myClass &x); 

Es posible que tenga que hacer de esto una amigo de myClass si necesita acceder a miembros protegidos/privados.

2

Esto da como resultado un error de compilación, a menos que tenga un operador de tipo de letra sobrecargado para algún tipo que ostream sepa. Puede agregar sus propios tipos a los tipos que ostream conoce al sobrecargar el global ostream& operator(ostream& os, const myClass& x) o hacer que su tipo sea convertible a cadena/int, etc. Sin embargo, tenga cuidado, la sobrecarga encasillada puede dispararle en el pie y se considera una mala práctica.

La forma más sencilla es simplemente imprimiendo algunas variables de la clase:

myClass inst; 
cout << inst.getName() << ": " << inst.getSomeValue(); 
1

Para poder utilizar std::cout << someClass, usted tiene que crear un operador como siguiente:

std::ostream &operator<< (std::ostream &, const someClass &); 
4

Mediante la creación de un amigo operador de salida, como en el siguiente ejemplo.

#include <iostream> 

class MyClass { 
    friend std::ostream & operator<<(std::ostream &out, const MyClass &inst); 
public: 
    // ... public interface ... 
private: 
    char array[SOME_FIXED_SIZE]; 
}; 

std::ostream & operator<<(std::ostream &out, const MyClass &inst) 
{ 
    out.write(inst.array, SOME_FIXED_SIZE); 
    return out; 
} 

Por favor, no esto hace algunas suposiciones acerca de lo que entendemos por "matriz de caracteres", que se simplifica en gran medida si su matriz de caracteres es de hecho nulo (0 caracteres) terminado.

Actualización: Diré que esto no es estrictamente un valor de retorno para la clase, sino más bien una representación textual de la clase, que usted es libre de definir.

+0

No tiene que ser función de amigo, pero luego tiene que agregar otro método de función pública a la clase, que realmente imprimirá valores (o lo que sea) para el ostream. –

+0

Es posible que toda la información necesaria para imprimir el objeto esté disponible en funciones públicas. El 'operador <<()' tiene que ser externo a la clase (ya que el primer argumento no es del tipo de clase). Puede ser un "amigo" si obtiene toda su información de la interfaz de clase pública. Puede llamar a una función miembro para realizar la impresión y, a veces, esta es una buena idea. –

+0

@VJo + @David - sí Estoy totalmente de acuerdo en que no necesita ser una función de amigo si puede recopilar toda la información de la interfaz pública. –

Cuestiones relacionadas