(Editado de post original para cambiar "mensaje base" a "mensaje base const &")C++ Resumen de la sobrecarga de operadores de clase y la aplicación de interfaz pregunta
Hola a todos, Estoy muy nuevo en C++, así que ustedes, amigos espero puede ayudarme a "ver los errores de mi camino".
Tengo una jerarquía de mensajes y estoy tratando de usar una clase base abstracta para forzar una interfaz. En particular, quiero forzar cada mensaje derivado para proporcionar un operador < < sobrecargado.
Cuando intento hacer esto con algo como esto:
class BaseMessage
{
public:
// some non-pure virtual function declarations
// some pure virtual function declarations
virtual ostream& operator<<(ostream& stream, const BaseMessage& objectArg) = 0;
}
el compilador se queja de que
"Error: no se puede declarar el parámetro 'objectArg' sea de tipo abstracto 'mensaje base'
Creo que también hay problemas de "amigo" involucrados aquí, pero cuando traté de declararlo como:
virtual friend ostream& operator<<(ostream& stream, const BaseMessage objectArg) = 0;
el compilador añade un error Además
"error: funciones virtuales no pueden ser amigos"
¿Hay una manera de asegurar que todos mis (mensaje) que las clases derivadas proporcionan una "< <" operador ostream ?
Gracias Mucho,
Steve
La respuesta de Nilolai es la mejor solución para lo que estás tratando de lograr. Sin embargo, el error específico que estaba obteniendo es porque está tratando de pasar un objeto BaseMessage por valor (el segundo argumento para su operador virtual <<). Esto no puede funcionar porque BaseMessage incluye una función virtual pura (el mismo operador virtual <<), por lo que no es posible construir una instancia de un BaseMessage para pasar por el valor. Observe que la versión del operador de Nilolai << toma su segundo argumento por referencia (será una clase derivada de Base). –