程序中的所有对象都继承自Container类。 Container类具有virtual BaseNode* getParent() const;
方法和virtual void setParent(BaseNode *p);
方法。
我有一个Set
课程(设置在网球比赛中,而不是数据结构中),其Match
课程为其父级(通过setParent()
)但是Set
从Container
继承,程序从上到下创建一个树结构,Set
类是一个子项,它不需要有方法来跟踪和维护有关它的父级的信息{ {1}}提供。
当我尝试编译程序时,错误Container
出现在下面的方法中。 (C++: invalid conversion from ‘BaseNode*’ to ‘Match*’
仅存在于Player* getPlayer1() const;
类)
Match
这是我的Match继承结构。 (请注意,Player* Set::getPlayer1() const{
return getParent()->getPlayer1();
}
是模板)
TreeNode
我不明白为什么我会收到对话错误。我曾尝试阅读我的教科书,但这是一个相当差的参考资料。谷歌刚刚提供了太多不相关的信息。
修改
Match -> TreeNode<Set> -> BaseNode -> Container
原因
Player* Set::getPlayer1() const{
return dynamic_cast<Match>(getParent())->getPlayer1();
}
修改2
我刚刚意识到我需要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)
才有效。
答案 0 :(得分:3)
问题是getParent()
返回BaseNode*
,它可能是指向任何类型的BaseNode
的指针 - 它可能指向一个不相关的类,它也派生自{{1} }。如果您100%确定父级必须属于BaseNode
类型,则应首先将父级转换为Match
,然后您可以在其上调用Match*
:
getPlayer()
如果父级不是Player* Set::getPlayer1() const{
return dynamic_cast<Match*>(getParent())->getPlayer1();
}
,那么Match
可能会返回NULL,所以一定要检查一下。
答案 1 :(得分:1)
我认为你真的需要重新组织你的层次结构和方法名称...这与你的问题无关,但总的来说似乎很难理解为什么Set继承自Match。 (不匹配有套装吗?)
游戏由点组成,集合由游戏组成,匹配由集合组成......玩家将赢得一个点。
你应该把它与现实世界更紧密地结合起来。
只是我的$ .02
修改
我可能有一个Match对象,其中包含集合映射(映射,即设置一,二,三等)和方法播放器(int),而不是Player1()和player2()。此外,似乎没有必要在Set类中使用播放器的方法。 Set将指向正在播放的匹配。