【问题标题】:C++ - Casting a variable of {superclass} to {subclass} [closed]C++ - 将 {superclass} 的变量转换为 {subclass} [关闭]
【发布时间】:2014-05-24 07:39:11
【问题描述】:

作为学习C++后的练习程序,我正在开发一款基于文本的游戏。我正在使用面向对象的编程风格来处理世界/它们的对象。以下是有关其定义的必要信息:

class Object
{
    private:
        unsigned int id;
    public:
        unsigned int getID() const { return id; }
};
class TakeableObject: public Object
{
   ...
};
class EdibleObject: public TakeableObject
{
    private:
        float healthEffect;
        float staminaEffect;
    public:
        float getHealthEffect() const { return healthEffect; }
        float getStaminaEffect() const { return staminaEffect; }
};
class Player
{
    private:
        float health;
        float stamina;
        TakeableObject inventory[256];
    public:
        eat(const EdibleObject* o)
        {
            health += o->getHealthEffect();
            stamina += o->getStaminaEffect();
        }
        eat(int id)
        {
            if (inventory[id] == NULL)
                throw "No item with that ID!";
            eat((EdibleObject) inventory[id]);
            inventory[id] = NULL;
        }
};

所以我的问题是 - 在Player::eat(int) 中,有没有办法可以确保Player::inventory[id] 中的ObjectEdibleObject(也许通过异常处理?)

【问题讨论】:

  • 应该更新 Stackoverflow 以拒绝不包含问号的问题。 :-)
  • 抱歉,误按了 Enter 键。我正在写完这篇文章
  • 为什么这个问题被关闭了?这不是不清楚。
  • 为什么inventory 使用固定大小的数组?将其设为map,您的问题就会自行解决。
  • @BenjaminBannier 每个对象都有一个特定的 ID - 由于协议,世界上只能有 255 个对象。

标签: c++ inheritance casting


【解决方案1】:

用户动态转换以在运行时检查对象类型。

或者您可以在父类中使用具有默认定义的虚函数,并可以根据派生类中的要求对其进行更新。

而不是eat((EdibleObject) inventory[id]); 使用以下

EdibleObject *temp = dynamic_cast<EdibleObject *>( &inventory[id] );
if(temp) { eat(*temp); }
else { /* Handling */ }

您的代码受到Object splicing 的影响,请务必先摆脱它。

【讨论】:

  • 没有问题的答案!大声笑!
  • StackOverflow 危险!
  • 请重新阅读问题 - 它还没有完成。
  • 感谢指出切片问题,我什至不知道它存在(因为它在Java中不存在)
  • 你是对的,因为在 Java 中一切都是参考。在 C++ 中,对象和引用是不同的。
猜你喜欢
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多