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

Foi útil?

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;
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top