C ++: conversion non valide de & # 8216; BaseNode * & # 8217; pour & # 8216; correspondre * & # 8217;
-
19-08-2019 - |
Question
Tous les objets de mon programme héritent d'une classe Container. La classe Container a une méthode virtuelle BaseNode * getParent () const;
et une méthode virtuelle void setParent (BaseNode * p);
.
J'ai une classe Set
(définie dans un match de tennis, pas une structure de données) qui a pour classe la classe Match
(via setParent ()
) mais puisque Set
hérite de Container
, le programme crée une arborescence de haut en bas et la classe Set
est un enfant. Il n’a pas besoin de méthodes pour suivre et conserver les informations sur son parent au-delà de ce que Container
fournit.
L'erreur C ++: conversion non valide de & # 8216; BaseNode * & # 8217; to * 8216; Match * & # 8217;
apparaît dans la méthode ci-dessous lorsque j'essaie de compiler mon programme. ( Player * getPlayer1 () const;
n'existe que dans la classe Match
)
Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
Ceci est ma structure d'héritage pour Match. (Notez que TreeNode
est un modèle)
Match -> TreeNode<Set> -> BaseNode -> Container
Je ne comprends pas pourquoi je reçois une erreur de conversation. J'ai essayé de lire mon manuel, mais c'est une référence plutôt médiocre. Google vient de fournir trop d'informations non pertinentes.
Modifier
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
provoque
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)
Modifier 2
Je viens de me rendre compte que j'ai besoin de dynamic_cast < Match * >
pour fonctionner.
La solution
Le problème est que getParent ()
renvoie un BaseNode *
, qui pourrait être un pointeur sur tout type de BaseNode
- il pourrait pointer à une classe non liée qui dérive également de BaseNode
. Si vous êtes sûr à 100% que le parent doit être de type Match
, vous devez d'abord le convertir en Match *
, puis appeler getPlayer. ()
à ce sujet:
Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
Si le parent n'est pas nécessaire pour une correspondance
, dynamic_cast
peut renvoyer NULL, assurez-vous donc de vérifier cela.
Autres conseils
Je pense que vous devez vraiment réorganiser votre hiérarchie et les noms de méthodes ... Cela n'a rien à voir avec votre question, mais en général, il semble difficile de comprendre pourquoi Set hérite de Match. (une correspondance n'a-t-elle pas d'ensembles?)
Les jeux sont composés de points, les ensembles sont composés de jeux et un match est composé d’ensembles ... un point est gagné par un joueur.
vous devriez probablement le structurer plus près du monde réel.
juste mon .02 $
EDIT
J'aurais probablement un objet Match contenant une carte d'ensembles (c'est-à-dire une, deux, etc.) et le lecteur de méthode (int) plutôt que Player1 () et player2 (). De plus, il ne semble pas nécessaire d’avoir une méthode pour les joueurs de la classe Set. Un set indiquerait un match dans lequel il est joué.