C ++: conversión no válida desde & # 8216; BaseNode * & # 8217; a & # 8216; Match * & # 8217;

StackOverflow https://stackoverflow.com/questions/341668

  •  19-08-2019
  •  | 
  •  

Pregunta

Todos los objetos en mi programa heredan de una clase Container. La clase Container tiene un método virtual BaseNode * getParent () const; y un método virtual void setParent (BaseNode * p); .

Tengo una clase Set (establecida en un partido de tenis, no una estructura de datos) que tiene la clase Match como padre (a través de setParent () ) pero como Set hereda de Container , el programa crea una estructura de árbol de arriba hacia abajo y la clase Set es un elemento secundario , no necesita tener métodos para rastrear y mantener información sobre su padre más allá de lo que proporciona Container .

El error C ++: conversión no válida de & # 8216; BaseNode * & # 8217; para & # 8216; Match * & # 8217; aparece en el método a continuación cuando intento compilar mi programa. ( Player * getPlayer1 () const; solo existe en la clase Match )

Player* Set::getPlayer1() const{
    return getParent()->getPlayer1();
}

Esta es mi estructura de herencia para Match. (Tenga en cuenta que TreeNode es una plantilla)

Match -> TreeNode<Set> -> BaseNode -> Container

No entiendo por qué recibo un error de conversación. He intentado leer mi libro de texto pero es una referencia bastante pobre. Google acaba de proporcionar demasiada información irrelevante.

Editar

Player* Set::getPlayer1() const{
    return dynamic_cast<Match>(getParent())->getPlayer1();
}

causas

error: cannot dynamic_cast ‘#‘obj_type_ref’ not supported by dump_expr#<expression error>((&((const Set*)this)->Set::<anonymous>))’ (of type ‘class BaseNode*’) to type ‘class Match’ (target is not pointer or reference)

Editar 2

Me acabo de dar cuenta de que necesito dynamic_cast < Match * > que funciona.

¿Fue útil?

Solución

El problema es que getParent () devuelve un BaseNode * , que podría ser un puntero a cualquier tipo de BaseNode - podría apuntar a una clase no relacionada que también se deriva de BaseNode . Si está 100% seguro de que el padre debe ser del tipo Match , primero debe convertir el padre en un Match * , y luego puede llamar a getPlayer () en eso:

Player* Set::getPlayer1() const{
    return dynamic_cast<Match*>(getParent())->getPlayer1();
}

Si el padre no es necesario un Match , entonces dynamic_cast puede devolver NULL, así que asegúrese de verificarlo.

Otros consejos

Creo que realmente necesita reorganizar sus nombres de jerarquía y método ... Esto no tiene nada que ver con su pregunta, pero en general parece difícil entender por qué Set hereda de Match. (¿un partido no tiene sets?)

los juegos se componen de puntos, los conjuntos se componen de juegos y un partido se compone de conjuntos ... un jugador gana un punto.

probablemente deberías estructurarlo más cerca del mundo real.

solo mis $ .02

EDITAR

Probablemente tendría un objeto Match que contiene un mapa de conjuntos (mapa, es decir, conjunto uno, dos, tres, etc.) y el Método Player (int) en lugar de Player1 () y player2 (). Además, no parece necesario tener un método para el jugador en la clase Set. Un Set apuntaría a un partido en el que se está jugando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top