作为一个学习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)
中,有没有办法可以确保Object
Player::inventory[id]
为EdibleObject
(可能通过异常处理?)< / p>
答案 0 :(得分:0)
用户动态强制转换以在运行时检查对象类型。
或者您可以在父级中使用具有默认定义的虚函数,并可以根据您在派生类中的要求更新它。
而不是eat((EdibleObject) inventory[id]);
使用以下
EdibleObject *temp = dynamic_cast<EdibleObject *>( &inventory[id] );
if(temp) { eat(*temp); }
else { /* Handling */ }
您的代码遇到Object splicing,请务必先删除它。