C ++: conversion non valide de & # 8216; BaseNode * & # 8217; pour & # 8216; correspondre * & # 8217;

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

  •  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.

Était-ce utile?

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é.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top