不知道从哪里开始
Not sure where to start with this
所以只是建立一个物品和库存/装备系统。
我这样做的解决方案是有一个基本的Item类,然后是MeleeWeapon、RangedWeapon等子类,这些子类将附加更具体的值和函数。
我的问题在这里:
unsigned int Player::equipItem(Item item)
{
//first, we equip the item
switch (item.subClass) {
case SC::MELEE_WEAPON :
if (item.isOneHanded) {
//unequip mainhand (returns 2! so we can see if something was already there, equip mainhand slot.
//blabla
return 1; // yay!
}
break;
case SC::RANGED_WEAPON :
break;
case SC::SHIELD :
break;
case SC::ARMOR :
break;
}
return 0; //somethings fucked up.
}
所以,错误是第6行,这是因为物品没有isOneHanded,但MeleeWeapon有。这在运行时是安全的,我有99.9999%的把握,但编译器不知道。我在某个地方看到了你可以手动动态地将其投射到MeleeWeapon,我玩了这个,得到了更多令人困惑的错误,等等
SC::。。。正是我用来识别项目是什么子类的。
至于我正在寻找的解决方案:
尽可能简单和尽可能多的解释。我要学的不是复制粘贴!非常感谢。
如果你100%确定物品是MeleeWeapon类型,那么你可以使用upcast。或者,您可以使用动态强制转换来解决此问题。
unsigned int Player::equipItem(Item item)
{
//first, we equip the item
switch (item.subClass) {
case SC::MELEE_WEAPON :
MeleeWeapon * weapon = dynamic_cast<MeleeWeapon *>(&item);
if(weapon != nullptr)
{
if (weapon->isOneHanded) {
//unequip mainhand (returns 2! so we can see if something was already there, equip mainhand slot.
//blabla
return 1; // yay!
}
}
else //this item is not a MeleeWeapon
{
}
break;
case SC::RANGED_WEAPON :
break;
case SC::SHIELD :
break;
case SC::ARMOR :
break;
}
return 0; //somethings fucked up.
}
您必须将item
强制转换为实数类型。为此,请使用dynamic_cast
。dynamic_cast
在运行时检查是否允许将item
转换为真实类型。如果item
可以转换为您想要的内容,它将返回一个正确的指针,如果不能,则返回null指针(在动态强制转换指针的情况下-在引用强制转换的情况下,它将抛出一个异常)。它只适用于虚拟类。
case SC::MELEE_WEAPON :
{ // Brace are required here to allow declaration of local melee
MeleeWeapon * melee = dynamic_cast<MeleeWeapon *>(&item);
if (melee) // If cast has succeed
{
if (melee.isOneHanded) {
//unequip mainhand (returns 2! so we can see if something was already there, equip mainhand slot.
//blabla
return 1; // yay!
}
}
break;
}
case SC::RANGED_WEAPON :
{
RangedWeapon * ranged = dynamic_cast<RangedWeapon *>(&item);
if (ranged) // If cast has succeed
{
break;
}
//.... and so on
如果你使用C++11,你也可以用替换做动态投射的行
auto melee = dynamic_cast<MeleeWeapon *>(&item);
您有一个接受Item
的函数,并希望根据该Item
的类型(和其他属性)返回unsigned int
。
您可以使用dynamic_cast
,前提是MeleeWeapon
(和其他项目)继承自Item
(并由其他答案建议)。
对我来说,使用多态性比切换更有意义。
class Item
{
public:
virtual ~Item() = 0;//don't forget this
virtual unsigned int equip() const
{
return 0;
}
};
class MeleeWeapon : public Item //you do have this already, right?
{
public:
MeleeWeapon(bool oneHanded) : oneHanded(oneHanded)
{
}
virtual unsigned int equip() const
{
return oneHanded ? 1 : 0;
}
private:
bool oneHanded;
};
class Player
{
public:
unsigned int equipItem(const Item & item);//note the signature change
};
unsigned int Player::equipItem(const Item & item)
{
return item.equip();
}
相关文章:
- 努力将整数转换为链表。不知道我在这里做错了什么
- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 叮当不知道PTRDIFF_MAX?
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 我正在尝试使用 c++ 创建一个货币转换程序,我不知道如何继续
- 不知道某个东西是否被忽略会引入未定义的行为吗
- 如何在C++中读取空格分隔的输入 当我们不知道输入的数量时
- 我不知道这条线是做什么的
- 如何在不知道C++中有多少可选参数的情况下在循环中使用va_arg?
- 在不知道套接字的情况下关闭网络连接
- 如果我不知道每个列表中有多少个数字,我如何将给定数量的数字列表作为输入?
- 我不知道导致错误的原因 (C3074)
- 我不知道为什么这段代码会让核心被转储?
- 我正在尝试制作一个自平衡机器人,但编译时存在错误。我不知道如何解决它
- 我看过Stellarium代码,我不知道它从哪里开始
- 我必须编写一个FTP客户端.不知道从哪里开始.C++
- 想要在OSX上的OpenCV中实时镜像视频,不知道从哪里开始
- QWidget-不知道从哪里开始
- 不知道从哪里开始