El problema con esta configuración es que el operador < < que definió anteriormente es una función libre, que no puede ser virtual (no tiene un objeto receptor). Para hacer que la función sea virtual, debe definirse como un miembro de alguna clase, lo cual es problemático aquí porque si define operador < < como miembro de una clase, los operandos estarán en el orden incorrecto:
class MyClass {
public:
virtual ostream& operator<< (ostream& out) const;
};
significa que
MyClass myObject;
cout << myObject;
no se compilará, pero
MyClass myObject;
myObject << cout;
será legal.
Para solucionar esto, puede aplicar el Teorema Fundamental de la Ingeniería de Software: cualquier problema puede resolverse agregando otra capa de indirección. En lugar de hacer operador < < virtual, considerar la adición de una nueva función virtual de la clase que tiene este aspecto:
class MyClass {
public:
virtual void print(ostream& where) const;
};
A continuación, defina operador < < como
ostream& operator<< (ostream& out, const MyClass& mc) {
mc.print(out);
return out;
}
De esta manera, el operador < < la función libre tiene el orden correcto de parámetros, pero el comportamiento del operador < < se puede personalizar en subclases.
Espero que esto ayude!
gracias es muy útil. Pensé en esta solución, pero pensé que tal vez Hay otra manera en que no sé que sea más fácil de implementar. –
* "cualquier problema puede resolverse agregando otra capa de direccionamiento indirecto" * - recuerde, cualquier problema excepto el problema de demasiadas capas de indirección;) – Kos
@Kos: No, no. Siempre y cuando haya declarado 'indirección sin signo;', solo tiene que seguir agregando más y más indirección y el problema se resolverá solo cuando pase el mouse sobre –