Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在指向对象的不同类型指针之间切换_C++_Pointers_Object_Casting_Downcast - Fatal编程技术网

C++ 在指向对象的不同类型指针之间切换

C++ 在指向对象的不同类型指针之间切换,c++,pointers,object,casting,downcast,C++,Pointers,Object,Casting,Downcast,到目前为止,我一直在使用动态铸造。但这是有利也有弊的。这似乎是一件好事,不要用太多。我发现,关于这个主题的例子通常都是与差异不大的类有关的。但在我的例子中,“儿童”类几乎没有相似之处 本文中的代码不是来自项目。它仅用于示例。 我正在为一个游戏制作一个交易系统,项目中将有更多的系统。有很多不同的项目可以做很多不同的事情-设备,修改,资源。无论它们有多大的不同,它们都有一个价格,并且它们都可以被放入一个库存中,不管它们是什么。但这就是相似性的终点,包括重写的方法 之后,不同的项目以完全不同的方式使用

到目前为止,我一直在使用动态铸造。但这是有利也有弊的。这似乎是一件好事,不要用太多。我发现,关于这个主题的例子通常都是与差异不大的类有关的。但在我的例子中,“儿童”类几乎没有相似之处

本文中的代码不是来自项目。它仅用于示例。

我正在为一个游戏制作一个交易系统,项目中将有更多的系统。有很多不同的项目可以做很多不同的事情-设备,修改,资源。无论它们有多大的不同,它们都有一个价格,并且它们都可以被放入一个库存中,不管它们是什么。但这就是相似性的终点,包括重写的方法

之后,不同的项目以完全不同的方式使用。起初,不同类型的物品被分类在不同类型的指针的单独数组中-一个用于设备,一个用于修改,e.t.c.要将物品放入库存,我只使用一种方法-
addToInventory(Item*Item)
。由于项目必须放置在正确的数组中,因此我使用动态转换-将
item*item
转换为(例如)
device*equi
,以便将其添加到设备数组中。我想用同样的方法,因为它更直观,否则不同的方法会有相似的代码

addToInventory(Item* item)
{
    if (item->type == 'e')
    {
        Equipment* newEquip = dynamic_cast<Equipment*>(item);
        equipmentArr.add(newEquip);//thous arrays are dynamic- the reason I needed to make the conversion explained later
    }
    else if (item->type == 'm')
    {
        Modification* newMod = dynamic_cast<Modification*>(item);
        modificationArr.add(newEquip);
    }
    //and so on...
}
但是,当我想打印一个清单时,我要么复制粘贴并编辑一些代码来转换数组中的指针,这样我就可以用相同的打印方法传递它们,要么复制粘贴并编辑相同的代码来打印。还有第三个选项-使数组指向指向项对象的所有指针数组。我试了最后一个选择

它摆脱了
添加到库存(物品*物品)
中的铸造,耶!但它导致每次我需要调用方法时都需要使用casting,比如
wearm::addMod(Modification*mod)
和其他地方。否则,我将需要将强制转换放在方法中,但我希望该方法显式地采用
device*
参数

这个项目还处于开发的早期阶段,所以我不知道我还需要使用casting,以便在需要时在不同类型的指针之间来回切换


因此,在类似的情况下,我应该如何在不同类型的指针之间切换?

您可能希望将(广泛的)
实现的特性(即
设备
修改
)表示为纯虚拟类(即接口)。通过这种方式,这些接口的动态强制转换和动态强制转换检查是正常的,并且将降低
设备
修改
的实际实现所需的噪音

另一种方法是使用and
static\u cast
对接口进行编译时检查

取决于您的用例,哪种方式更合适。根据经验:

  • 主要是静态配置=>Do在编译时
  • 更多动态配置(运行时分配的实例)=>Do运行时

听起来虚拟函数可以满足您的需要?而且,从派生类中获取基类不需要强制转换。添加更多虚拟函数将使代码需要更多针对不同类型的“if”语句,从而使代码更复杂,更不直观。在代码中,我将把一个项目当作一个项目来对待,尽管实际上我把它当作一个修改。是的,我知道从派生类切换到基类时不需要强制转换。问题是另一种方式——从基础到派生。
addMod (Modification* mod)
{//all are found ONLY in class Weapon
    mod[modCount] = mod; //an array of Modification* pointers
    modCount++;
    calcEfficiency();
}