Pregunta

Tengo una clase que usa una estructura, y quiero sobrecargar el < < operador para esa estructura, pero solo dentro de la clase:

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);
}

Solo puedo compilar cuando declaro el operador < < sobrecargue con la palabra clave de amigo, 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 SOLO dentro de la clase?

Editar: desearé utilizar el operador sobrecargado para imprimir una my_struct que ES un miembro de My_Class

¿Fue útil?

Solución

  

¿Cómo sobrecargo el < < operador para my_struct SOLO dentro de la clase?

Defínelo 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 implementas MyClass .

EDITAR: Si realmente, realmente necesita tener un alcance en 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á todos los demás operadores personalizados < < definidos para clases no relacionadas (de nuevo, solo dentro de la clase y sus subclases), a menos que se puedan encontrar con ADL o sean miembros de std :: ostream ya está.

Otros consejos

No utilice el operador < < ;. Use una función miembro nombrada y hágala 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 constante, sea cual sea el método que utilice.

Editar: No es necesario que el operador < < un miembro de la clase solo para que pueda usarlo para imprimir un miembro de la clase. Puede convertirlo en un amigo de la estructura, o en una función completamente gratuita, que la clase utiliza.

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

   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;
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top