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

Posted

技术标签:

【中文标题】在指向对象的不同类型的指针之间切换【英文标题】:Switching between different types of pointers to objects 【发布时间】:2014-06-04 22:48:08 【问题描述】:

到目前为止,我一直在使用动态转换。但这有它的优点和缺点。似乎不要过多地使用它是一件好事。我发现的有关此主题的示例通常与几乎没有差异的类。但就我而言,“子”类几乎没有相似之处。

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

我正在为一款游戏制作交易系统,项目中还会有更多系统。有许多不同的项目可以做许多不同的事情——设备、修改、资源。无论它们有多么不同,它们都有一个价格,并且它们都可以放入库存中,无论它们是什么。但这就是相似之处的终结,包括被覆盖的方法。

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

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...

稍后我想对一件设备进行修改-Weapon::addMod(Modification* mod)。在这个方法中,我使用了仅在 Weapon 类中找到的其他方法和变量。

addMod (Modification* mod)
//all are found ONLY in class Weapon
    mod[modCount] = mod; //an array of Modification* pointers
    modCount++;
    calcEfficiency();

但是当我想做简单的事情来打印库存时,我要么必须复制粘贴并编辑一些代码来转换数组中的指针,所以我可以用相同的打印方法传递它们,或者复制 -粘贴和编辑相同的打印代码。还有第三个选项 - 使数组成为指向 Item 对象的所有指针数组。我尝试了最后一个选项。

它摆脱了addToInventory(Item* item) 的演员阵容,耶!但这导致每次我需要调用诸如Weapon::addMod(Modification* mod) 和其他地方的方法时都需要使用强制转换。否则,我需要在方法中进行强制转换,但我希望方法显式采用 Equipment* 参数。

该项目还处于开发初期,所以我不知道我可能还需要使用强制转换,所以我可以在需要时在不同类型的指针之间来回切换。

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

【问题讨论】:

听起来虚函数可以满足您的需求? 另外,您不需要强制转换即可从派生类中获取基类 添加更多虚函数会使代码需要更多针对不同类型的“if”语句,从而使其更加复杂和违反直觉。在代码中,我会将 Item 视为 Item,尽管实际上我将其视为 Modification。是的,我知道从派生类切换到基类时不需要强制转换。问题是另一种方式——从基础到派生。 【参考方案1】:

您可能希望将(广泛的)Item 实现的特征(即EquipmentModification)表示为纯虚拟类(即接口)。这种方式对这些接口进行动态转换和动态转换检查是可以的,并且会降低EquipmentModification 的实际实现需要处理的噪音。

另一种方法是使用CRTP pattern 和static_cast&lt;Interface*&gt; 对您的接口进行编译时检查。

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

大部分是静态配置 => 在编译时做 更多动态配置(运行时分配的实例)=> 在运行时做

【讨论】:

以上是关于在指向对象的不同类型的指针之间切换的主要内容,如果未能解决你的问题,请参考以下文章

point类型·

point类型·

重新解释适当对齐的指向具有声明类型的对象的指针

指向共享对象的指针在拥有它的不同对象中是不同的

C++中四种转换类型的区别

指针(pointer)总结