2008-12-04 9 views
2

Tous les objets de mon programme héritent d'une classe Container. La classe Container a une méthode virtual BaseNode* getParent() const; et une méthode virtual void setParent(BaseNode *p);.C++: conversion non valide de 'BaseNode *' à 'Match *'

J'ai une classe Set (Situé dans un match de tennis, pas une structure de données) qui a la classe Match comme son parent (via setParent()) mais depuis Set hérite de Container, le programme crée une structure d'arbre de haut en bas et la classe Set est un enfant, il n'a pas besoin d'avoir des méthodes pour suivre et maintenir des informations sur son parent au-delà de ce que Container fournit.

L'erreur C++: invalid conversion from ‘BaseNode*’ to ‘Match*’ apparaît dans la méthode ci-dessous lorsque j'essaie de compiler mon programme. (Player* getPlayer1() const; existe seulement 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 pauvre. 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 réaliser que j'ai besoin dynamic_cast<Match*> qui fonctionne.

Répondre

3

Le problème est que getParent() retourne un BaseNode*, ce qui pourrait être un pointeur à tout type de BaseNode - il peut pointer vers une classe sans rapport qui dérive aussi de BaseNode. Si vous êtes sûr à 100% que le parent doit être de type Match, vous devez jeté le parent à un Match* d'abord, puis vous pouvez appeler getPlayer() sur ce point:

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

Si le parent est pas nécessaire Match, puis dynamic_cast pourrait renvoyer NULL, alors assurez-vous de vérifier cela.

1

Je pense que vous avez vraiment besoin de réorganiser votre hiérarchie et vos 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. (un match n'a-t-il pas de sets?)

les jeux sont composés de points, les sets sont composés de jeux et un match est composé de sets ... un point est gagné par un joueur.

vous devriez probablement le structurer plus étroitement au monde réel.

juste mon $ .02

EDIT

Je devrais probablement un objet de match qui contient une carte de jeux (carte à savoirdéfinir un, deux trois, etc) et le Method Player (int) plutôt que Player1() et player2(). Aussi, il ne semble pas nécessaire d'avoir une méthode pour joueur dans la classe Set. Un Set pointe vers un match dans lequel il est joué.

+0

L'ensemble hérite du conteneur, Match hérite de TreeNode. La structure entière est en forme d'arbre. Les matchs ont Set enfants. Les détails d'un jeu ne sont pas requis pour cette application, donc Set contient les statistiques. – epochwolf

+0

"Effrayant" est tout ce que je peux dire. – Tim

+0

Effrayant mais j'ai environ 80% moins de code et j'ai appris beaucoup plus de choses que je ne l'aurais fait sans héritage. – epochwolf