c++ - 在不同类型的对象指针之间切换

标签 c++ pointers object casting downcast

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

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

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

之后,不同的元素以完全不同的方式使用。起初,不同类型的项目被分类在不同类型的单独指针数组中——一个用于设备,一个用于修改,等等。要将某些东西放入 list ,我只使用一种方法 - addToInventory(Item* item)。由于项目必须放在正确的数组中,我使用动态转换 - 我将 Item* item 转换为(例如)Equipment* 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...
}

稍后我想对一件设备添加修改 - 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* 参数。

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

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

最佳答案

您可能想要表示您的(广泛的)Equipment 的特征(即 ModificationItem )作为纯虚拟类(即接口(interface))的实现。这样,这些接口(interface)的动态转换和动态转换检查就可以了,并且会降低噪声以处理 Equipment 的实际实现。和 Modification .

另一种方法是使用 CRTP patternstatic_cast<Interface*>对您的接口(interface)进行编译时检查。

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

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

关于c++ - 在不同类型的对象指针之间切换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24048872/

相关文章:

java - 如何创建对象列表并访问其属性

python - 将列表中所有可能的对象配对

c++ - new 然后扔进 C++ 构造函数?

c++ - 我如何调用/发送消息到 fastcgi 应用程序?

c - 如何将指针打印到指针

c++ - 在《Effective C++》书中的这个示例中,返回对象指针的函数的实现细节是什么?

javascript - 如何console.log所有继承的属性?

c++ - typedef 指针是个好主意吗?

c++ - 从内存缓冲区处理视频流

c++ - 如何验证接收到的字节数组的长度,它不是空终止的?