C ++:从“BaseNode *”到“Match *”的无效转换

时间:2008-12-04 18:51:08

标签: c++ inheritance dynamic-cast

程序中的所有对象都继承自Container类。 Container类具有virtual BaseNode* getParent() const;方法和virtual void setParent(BaseNode *p);方法。

我有一个Set课程(设置在网球比赛中,而不是数据结构中),其Match课程为其父级(通过setParent())但是SetContainer继承,程序从上到下创建一个树结构,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) 才有效。

2 个答案:

答案 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将指向正在播放的匹配。