Tengo una jerarquía de clases bastante compleja en la que las clases son cruzadas dependiendo de cada una: Hay dos clases abstractas A y C que contienen un método que devuelve una instancia de C y A, respectivamente. En sus clases heredadas, quiero usar un tipo de covariante, que en este caso es un problema, ya que no conozco una forma de reenviar: declarar la relación de herencia.C++: ¿Cómo puedo evitar el "tipo de retorno covariante no válido" en clases heredadas sin conversión?
Obtengo un "test.cpp: 22: error: tipo de retorno de covariante no válido para 'virtual D * B :: outC()'" - error ya que el compilador no sabe que D es una subclase de C.
class C;
class A {
public:
virtual C* outC() = 0;
};
class C {
public:
virtual A* outA() = 0;
};
class D;
class B : public A {
public:
D* outC();
};
class D : public C {
public:
B* outA();
};
D* B::outC() {
return new D();
}
B* D::outA() {
return new B();
}
Si cambio el tipo de retorno de B :: outC() a C *, el ejemplo se compila. ¿Hay alguna manera de mantener B * y D * como tipos de devolución en las clases heredadas (sería intuitivo para mí que haya una manera)?
¿Realmente necesitas ese tipo de enredo? (Llamarlo acoplamiento podría ser un poco corto) –
A veces no es un problema de lenguaje, es un problema con la forma en que tratamos de usarlo. Si sus dos jerarquías están tan profundamente acopladas, creo que sería mejor con una jerarquía (fusionando 'A' con' C' y 'B' con' D') ya que parece que no pueden funcionar sin la una a la otra de todos modos . –
Bueno, tengo dos tipos de clases: una especificación para una tarea y un ejecutor que realmente ejecuta la tarea (inicia varios hilos). La especificación en sí debe ser una fábrica para la tarea y cada ejecutor debe acceder a sus especificaciones. Y hay varias especificaciones con sus tareas. Entonces el ejecutor ajusta una especificación, por lo que el acoplamiento es solo fuerte en una dirección, en la otra dirección es solo el método de fábrica. – Searles