Me he encontrado con un problema complicado en algunos códigos C++, que se describe más fácilmente con el código. Tengo clases que son algo así como:Anulando una variable miembro en C++
class MyVarBase
{
}
class MyVar : public MyVarBase
{
int Foo();
}
class MyBase
{
public:
MyBase(MyVarBase* v) : m_var(v) {}
virtual MyVarBase* GetVar() { return m_var; }
private:
MyVarBase* m_var;
}
También tengo una subclase de MyBase que tiene que tener un miembro de tipo MiVar porque tiene que llamar Foo. Mover la función Foo a MyVarBase no es una opción. ¿Tiene sentido hacer esto:
class MyClass : public MyBase
{
public:
MyClass(MyVar* v) : MyBase(v), m_var(v) {}
MyVar* GetVar() { return m_var; }
private:
MyVar* m_var;
}
Esto parece funcionar, pero se ve muy mal y no estoy seguro de si se va a producir una pérdida de memoria o romper un constructor de copia. Mis otras opciones podrían ser nombrar la variable MyVar en MyClass algo más, pero que sea igual al puntero m_var en la base, o modelar MyBase en el tipo MyVar.
Todas estas opciones no parecen ideales, así que quería saber si alguien más se ha encontrado en una situación como esta y si hay una buena manera de hacerlo funcionar.
Usaría dynamic_cast <> en lugar de static_cast <> en este caso. Creo que capta mejor la intención. – coryan
No solo eso, sino que el retorno de dynamic_cast <> devolverá null si v no es un MyVar. – KeithB
no coryan. dynamic_cast sería peor. ya que los lectores pensarían que GetVar podría devolver MyVarBase, lo que sería incorrecto –