operador sobrecarga << dentro de uma classe em C ++
-
05-07-2019 - |
Pergunta
Eu tenho uma classe que usa um struct, e eu quero sobrecarregar o operador << para esse struct, mas apenas dentro da classe:
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);
}
Eu só pode compilar quando eu declarar o operador << sobrecarga w / o amigo de palavras-chave, mas, em seguida, o operador está sobrecarregado em todos os lugares no meu código, não apenas na classe. Como faço para sobrecarregar o operador << para my_struct apenas dentro da classe?
Edit: eu vai querer usar o operador sobrecarregado para imprimir um my_struct que é um membro da My_Class
Solução
Como faço para sobrecarregar o operador << para my_struct apenas dentro da classe?
Defina-lo como
static std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
ou
namespace {
std::ostream & operator<<( std::ostream & o, const my_struct & s ) { //...
}
no arquivo .cpp
em que você implementar MyClass
.
EDIT: Se você realmente precisa escopo da classe e nada mais, em seguida, defini-lo como uma função estática privada na referida classe. Será somente no escopo em que a classe e é subclasses. Ele irá esconder todos os outros operator<<
personalizado está definido para classes não relacionadas, embora (novamente, só que dentro da classe, e é subclasses), a menos que eles podem ser encontrados com ADL, ou são membros de std::ostream
já.
Outras dicas
Não use operador <<. Use uma função membro nomeado, e torná-lo privado.
class My_Class
{
public:
My_Class();
private:
void Print( ostream & os, const my_struct & m );
};
Observe que você deve passar a estrutura como uma referência const, independentemente do método utilizado.
Editar: Não há necessidade de fazer o operador << um membro da classe só assim você pode usá-lo para imprimir um membro da classe. Você pode torná-lo um amigo da estrutura, ou uma função completamente livre, que a classe usa então.
Se por "única sobrecarregado na My_Class" você quer dizer só é visível / utilizável por minha classe que você poderia usar uma sobrecarga de não-membro que só é visível para My_Class. Por exemplo.
struct my_struct {
int a;
char c;
};
class My_Class
{
publiC:
My_Class();
}
Então, em My_Class.cpp:
namespace {
ostream& operator(ostream& os, const my_struct& mystruct ) {
os << mystruct.a << mystruct.c;
}
}