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 ostreamy 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 Ay 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 namespacepara 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.dumpmétodo público es sucio e innecesario. Usarfriendaquí está perfectamente bien. Si prefiere un método redundante o intrusivofriendes una cuestión de gustos, aunquefriendpodrí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::ostreampara que acepte un operando de tipo izquierdostd::ostream.También puede hacerlo de esta manera, permitiendo el polimorfismo:
fuente
toStringcomportamiento 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::stringsolo 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 laStringsemá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,Ase desea una representación de cadena personalizada de una clase , simplemente escribiendo unastring to_string(A a)definición declass Asufijos 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::stringhaga lo siguiente:std::stringstreamse 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