Eu gostaria de controlar o que é gravado em um fluxo, ou seja cout
, para um objeto de uma classe personalizada. Isso é possível em C ++? Em Java, você pode substituir o toString()
método para fins semelhantes.
151
Em C ++, você pode sobrecarregar operator<<
para ostream
e sua classe personalizada:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
Dessa maneira, você pode gerar instâncias da sua classe nos fluxos:
A x = ...;
std::cout << x << std::endl;
Caso você operator<<
deseje imprimir páginas internas da classe A
e realmente precise acessar seus membros particulares e protegidos, você também pode declarar isso como uma função de amigo:
class A {
private:
friend std::ostream& operator<<(std::ostream&, const A&);
int j;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.j << ")";
}
friend
, e também dentro do corpo da classe - com isso, você não terá que fazerusing namespace
pelo espaço para nome que contém o operador (e a classe), mas a ADL o achará enquanto o objeto dessa classe for um dos operandos.dump
método público é sujo e desnecessário. Usarfriend
aqui é perfeitamente bom. Se você prefere um método redundante ou um intrusivo,friend
é uma questão de gosto, emborafriend
tenha sido discutido com esse objetivo exato.operator<<()
uma função de membro não funcionará: você precisaria torná-la uma função de membrostd::ostream
para aceitar um operando do tipo à esquerdastd::ostream
.Você também pode fazer dessa maneira, permitindo o polimorfismo:
fonte
toString
comportamento do Java .No C ++ 11, to_string é finalmente adicionado ao padrão.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
fonte
ToString()
é uma função virtual definida na classe base de todos os objetos e, portanto, é usada como uma maneira padrão de expressar uma representação de seqüência de caracteres de qualquer objeto. Essas funções sestd::string
aplicam apenas a tipos internos. A maneira idiomática no C ++ é substituir o<<
operador por tipos personalizados.operator<<
, em comparação com a simplesString
semântica de Java, me leva a observar que issoto_string()
não é apenas "uma adição útil", mas a nova maneira preferida de fazê-lo em C ++. Se, como no OP, uma representação de string personalizada de uma classeA
for desejada, basta escrever umastring to_string(A a)
definição abaixo declass A
suficiente. Isso se propaga com herança como em Java e pode ser combinado (por adição de sequência) como em Java. De qualquer forma, o domínio não substituídotoString()
em Java é de uso limitado.Como uma extensão do que John disse, se você deseja extrair a representação de string e armazená-la,
std::string
faça o seguinte:std::stringstream
está localizado no<sstream>
cabeçalho.fonte
A pergunta foi respondida. Mas eu queria adicionar um exemplo concreto.
Este exemplo requer a compreensão da sobrecarga do operador.
fonte