C ++运行时类切换,依赖于基类继承

时间:2015-02-11 16:53:53

标签: c++ class runtime

我并不完全精通C ++,而且我正在研究的当前项目已经遇到了一个小问题。我遇到过这个问题:http://www.terrainformatica.com/2010/08/cpp-how-to-change-class-of-object-in-runtime/但我不确定这是否是我正在寻找的解决方案,或者是否有更好的选择。

我的意图是切换存储在内存中的炮塔类型,尽管它们是基础CTurret的不同实例。并且尽可能减少对性能的影响,因为这将在一个简单的游戏中实现。

基本上我有一个基类CTurret的基类CEntity。现在我有几个炮塔(基本,快速,无害)。每个炮塔使用基类CTurret我想保留一些记忆来保存通用炮塔,然后可以简单地将其换成实际的炮塔类型。以下更好的视觉效果:

class CEntity...
class CTurret : public CEntity...
class CBasicTurret : public CTurret...
class CFastTurret : public CTurret...

记忆(5个通用炮塔)
Array [CTurret,CTurret,CTurret,CTurret,CTurret] //不能使用泛型!

用户想要一个基本的炮塔,填充一个可用的通用炮塔:
阵列[CBasicTurret,CTurret,CTurret,CTurret,CTurret] //啊,我将使用的基本炮塔。

不再需要时:
Array [CTurret,CTurret,CTurret,CTurret,CTurret] //返回原文。

到目前为止,我只能看到两种方法来实现我的目标:
1)我可以将所有炮塔类型放在基础类中,并将其从基础改为......实际的类。但这会很快变得混乱 2)我可以为每个炮塔类型保留记忆,这不是理想的情况,因为记忆是珍贵的,不应该浪费。此外,用户可能会请求超出已预留的数量,这可能会造成未来的问题。

1 个答案:

答案 0 :(得分:1)

您需要确定炮塔类型之间的区别。

一般选择是多态基类(使用派生类重写继承的虚函数以专门化行为)或具有状态的单个类(例如,用于描述操作模式的枚举类型,用于描述速度的浮点数等)。 / p>

如果您决定使用多态基础,则可以使用智能指针数组。只需选择要使用的指针(或数组索引)即可。无论如何,指针(以及它们指向的对象)都将在内存中。

使用单个对象,只需根据需要更改其状态。因此,更改高度,宽度,操作模式等值。如果您真的担心内存使用情况,那么这是更好的选择(内存中只需要一个对象,尽管没有什么可以阻止您拥有一个对象数组,其中每个元素都有有不同的状态。)

您链接到的放置新技巧有一些已经被掩盖的陷阱,并且将具有数据的对象变形为不存在的对象的特定示例是有问题的(例如,导致调用者表现出未定义的行为)。