operador de sobrecarga < < dentro de una clase en c ++
-
05-07-2019 - |
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
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;
}
}