2009-07-29 22 views
5

tengo una clase que utiliza una estructura, y quiero sobrecargar el operador < < para esa estructura, pero sólo dentro de la clase:operador de sobrecarga << dentro de una clase en C++

typedef struct my_struct_t { 
    int a; 
    char c; 
} my_struct; 

class My_Class 
{ 
    public: 
    My_Class(); 
    friend ostream& operator<< (ostream& os, my_struct m); 
} 

sólo puedo compilar cuando declaro el operador < < sobrecarga w/la palabra clave friend, pero luego el operador está sobrecargado en todas partes en mi código, no solo en la clase. ¿Cómo sobrecargo el operador < < para my_struct SOLAMENTE dentro de la clase?

Edit: tendrá que usar el operador sobrecargado para imprimir un my_struct que es un miembro de My_Class

+2

Pero solo está sobrecargado cuando llamas 'operator <<' con 'my_struct', ¿no es así? –

+3

Tenga en cuenta que la expresión 'typedef struct' no es realmente necesaria en C++: http://stackoverflow.com/questions/612328/difference-between-struct-and-typedef-struct-in-c –

Respuesta

9

¿Cómo sobrecargar el operador < < para my_struct sólo dentro de la clase?

definirlo como

static std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 

o

namespace { 
    std::ostream & operator<<(std::ostream & o, const my_struct & s) { //... 
} 

en el archivo .cpp en el que se implementa MyClass.

EDIT: Si realmente necesita ampliar el alcance de la clase y nada más, defínalo como una función estática privada en dicha clase. Solo estará dentro del alcance de esa clase y sus subclases. Sin embargo, ocultará todas las otras operator<< personalizadas definidas para clases no relacionadas (de nuevo, solo dentro de la clase y sus subclases), a menos que se puedan encontrar con ADL o ya sean miembros de std::ostream.

+0

Asume uno El archivo .cpp solo contiene una clase, que a menudo no es el caso. –

+0

Ese es el caso para la mayoría de mis clases. Si hay una segunda clase en el archivo '.cpp', es un detalle de implementación de la clase" principal ", y la exposición extendida no importará. Y ayuda a mantener el archivo '.h' limpio, lo que nunca debe subestimarse. –

+0

+1 Pensé que el espacio de nombre sin nombre rompería las reglas de ADL, pero después de probar con g ++ y comeau parece como si no fuera así. Niza. –

10

No utilice el operador < <. Use una función de miembro con nombre y haga que sea privada.

class My_Class 
{ 
    public: 
    My_Class(); 
private: 
    void Print(ostream & os, const my_struct & m); 
}; 

Tenga en cuenta que debe pasar la estructura como una referencia directa, cualquiera que sea el método que utilice.

Editar: No hay necesidad de que el operador < < un miembro de la clase sólo para que pueda utilizarlo para imprimir un miembro de la clase. Puedes hacer que sea un amigo de la estructura, o una función completamente libre, que luego usa la clase.

1

Si "solo está sobrecargado en My_Class" quiere decir que solo es visible/utilizable por mi clase, podría usar una sobrecarga que no sea miembro que solo sea visible para My_Class. P.ej.

struct my_struct { 
     int a; 
     char c; 
    }; 

    class My_Class 
    { 
     publiC: 
     My_Class(); 
    } 

Luego, en My_Class.cpp:

namespace { 
    ostream& operator(ostream& os, const my_struct& mystruct) { 
     os << mystruct.a << mystruct.c; 
    } 
} 
+0

¿Por qué está eliminando & ¿Resolver las respuestas que dicen lo mismo? –

+0

Quise editar y de alguna manera obtuve una copia de la respuesta. Así que borré el primero.Luego la pregunta cambió, así que eliminé mi 2ª e iba a agregar una tercera respuesta, pero SO sugirió que editara una existente, así que eliminé la primera y la edité, y para entonces era una clon suya :-( – maccullt

Cuestiones relacionadas