【问题标题】:C++: Array of parent and child objectsC++:父对象和子对象的数组
【发布时间】:2012-08-15 01:48:56
【问题描述】:

我正在设计一款游戏,其中一些玩家牌是已知的,而另一些则不是。为此,我创建了一个带有子“OpenPlayer”和“ClosedPlayer”的父对象“Player”。

我想将这个游戏中的所有玩家组成一个数组,以方便游戏管理。但是,我也希望能够酌情访问 OpenPlayer 和 ClosedPlayer 中的特殊方法。这可能吗?

编辑:我实际上正在考虑使用来自 STL 的向量,因为由于玩家数量可变,这可能更合适。

【问题讨论】:

标签: c++ arrays inheritance


【解决方案1】:

一般来说,你不能创建一个元素属于不同类类型的 C++ 数组;每个数组元素的大小必须相同,不同的子类不一定如此。将不同类型放入数组中会导致切片,这是子类的数据成员令人惊讶的消失。

但是,如果您为不同的子类创建一个 指针 数组,那么您将能够轻松地做您想做的事。如果玩家的数量可以变化,您也可以考虑使用vector 而不是数组。

【讨论】:

  • 啊,我没有想到使用指针。这是个好主意,谢谢。如果我将它设为“播放器”的向量,我是否可以让它同时引用开放和封闭播放器?抱歉,如果这是一个愚蠢的问题,我是 C++ 新手。
  • 一个vector<Player*> 会工作;一个普通的vector<Player> 也会遇到切片问题。
  • 我可以使用vector,但是我需要访问一些非虚拟方法。铸造似乎工作正常,但我怎么能告诉哪个孩子铸造?我尝试比较 typeid,但这似乎对我不起作用。
  • 就是这样;也许告诉我们到底出了什么问题,我们可以找出问题所在?
  • 每当我尝试 typeid 时,它只会给我Player* 作为类型,所以我不知道要转换成什么。我意识到我可以使用 dyanmic_cast。这似乎对我有用。这是正确的做法吗?
【解决方案2】:

我认为“访问特殊方法”是指 OpenPlayer 或 ClosedPlayer 中的方法?

通过数组,我假设您的意思是一些 STL 集合;-)

简短的回答是“不”。

长答案是“可以,但是您需要将对象转换为正确的类型。这意味着您的设计是错误的。”

另一种设计可能是让“打开”或“关闭”成为 Player 类的属性,而不是单独的子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-11-28
    • 2020-01-21
    • 2011-10-19
    • 1970-01-01
    相关资源
    最近更新 更多