在指向对象的不同类型指针之间切换
Switching between different types of pointers to objects
到目前为止,我一直在使用动态铸造。但这是有利有弊的。似乎这是一件好事,不要使用太多。我所发现的关于这个主题的例子,通常都是类,它们之间的差别很小。但是在我的例子中,"子"类几乎没有相似之处。
这篇文章中的代码不是来自项目。
我正在为游戏制作一个交易系统,在项目中会有更多的系统。游戏中有许多不同的道具可以做许多不同的事情——装备、改装、资源。不管它们有多不同,它们都有一个价格,它们都可以被放入库存中,不管它们是什么。但是相似之处就到此为止了,包括被重写的方法。
之后,不同的项目以完全不同的方式使用。一开始,不同类型的物品在不同类型的指针的单独数组中排序——一个用于设备,一个用于修改,等等。要在库存中放入一些东西,我只使用一种方法——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)
中摆脱了cast,耶!但它导致每次我需要调用Weapon::addMod(Modification* mod)
等方法时都需要使用强制类型转换。否则,我将需要将类型转换放在方法中,但我希望该方法显式地接受Equipment*
参数。
这个项目还处于早期开发阶段,所以我不知道我还需要使用多少类型的强制转换,所以我可以在需要的时候在不同类型的指针之间来回切换。
那么,在类似的情况下,我应该如何在不同类型的指针之间切换呢?您可能希望将(广泛)Item
实现的特征(即Equipment
和Modification
)表示为纯虚拟类(即接口)。这样,这些接口的动态强制转换和动态强制转换检查是可以的,并且可以降低Equipment
和Modification
实际实现的噪声。
另一种方法是使用CRTP模式和static_cast<Interface*>
对接口进行编译时检查。
取决于你的用例,哪种方式更合适。根据经验:
- 主要是静态配置=>在编译时执行
- 更多动态配置(运行时分配实例)=>在运行时执行
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- AVX 指令中寄存器和指针之间的客观差异
- 为什么不同类型层次结构的指针之间的dynamic_cast定义得很好?
- 介于 [固定数组] 和 [带内存分配的指针] 之间的性能
- 类指针之间的 Qt 差异
- 指向 POD 类型的指针之间的静态转换与重新解释转换
- 按值和引用传递指针之间的区别?
- 可以在指向不同模板类实例的指针之间进行强制转换吗
- 函数指针和传递指针之间的区别
- 作为 int 传递和类内部指针之间的差异给我带来了分段错误
- 比较C 中移动和智能指针之间的习惯
- 无效指针和非初始化的指针之间的差异
- 拉链比较整数和指针之间
- 指针数组(*a)[]和双指针** a之间的差异
- ->运算符和指针 * 之间的区别 (C++)
- 在 c++ 中,指向 int 的指针和指向指向 int 的指针之间的区别是什么?
- 指针之间的强制转换运算符
- 函数对象和函数指针之间的差异
- 指针之间的运算符重载
- 两个指针之间的差异是合法的 c++17 常量表达式