Me gustaría controlar lo que está escrito en una secuencia, es decir cout
, para un objeto de una clase personalizada. ¿Es eso posible en C ++? En Java, podría anular el toString()
método para un propósito similar.
151
En C ++ se puede sobrecargar operator<<
de ostream
y la clase personalizada:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
De esta manera, puede generar instancias de su clase en secuencias:
A x = ...;
std::cout << x << std::endl;
En caso de que operator<<
desee imprimir elementos internos de la clase A
y realmente necesite acceso a sus miembros privados y protegidos, también puede declararlo como una función amiga:
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
, y también dentro del cuerpo de la clase; con eso, no tendrá que hacerusing namespace
para el espacio de nombres que contiene el operador (y la clase), pero ADL lo encontrará siempre que el objeto de esa clase sea Uno de los operandos.dump
método público es sucio e innecesario. Usarfriend
aquí está perfectamente bien. Si prefiere un método redundante o intrusivofriend
es una cuestión de gustos, aunquefriend
podría decirse que se ha introducido para este propósito exacto.operator<<()
una función miembro no funcionará: tendría que hacer que sea una función miembrostd::ostream
para que acepte un operando de tipo izquierdostd::ostream
.También puede hacerlo de esta manera, permitiendo el polimorfismo:
fuente
toString
comportamiento de Java .En C ++ 11, to_string finalmente se agrega al estándar.
http://en.cppreference.com/w/cpp/string/basic_string/to_string
fuente
ToString()
es una función virtual definida en la clase base de todos los objetos y, por lo tanto, se utiliza como una forma estándar para expresar una representación de cadena de cualquier objeto. Estas funcionesstd::string
solo se aplican a los tipos integrados. La forma idiomática en C ++ es anular el<<
operador para los tipos personalizados.operator<<
, en comparación con laString
semántica simple de Java, me lleva a comentar queto_string()
no solo es "una adición útil", sino la nueva forma preferida de hacerlo en C ++. Si, como por el OP,A
se desea una representación de cadena personalizada de una clase , simplemente escribiendo unastring to_string(A a)
definición declass A
sufijos a continuación. Esto se propaga con herencia como en Java, y se puede combinar (mediante la adición de cadenas) como en Java. No anuladotoString()
en Java es de uso limitado de todos modos.Como una extensión de lo que dijo John, si desea extraer la representación de cadena y almacenarla,
std::string
haga lo siguiente:std::stringstream
se encuentra en el<sstream>
encabezado.fuente
La pregunta ha sido respondida. Pero quería agregar un ejemplo concreto.
Este ejemplo requiere comprender la sobrecarga del operador.
fuente