C++ Runtime类切换,依赖基类继承

标签 c++ class runtime

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

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

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

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

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

用户想要一个基本的炮塔,填充一个可用的通用炮塔:
Array[CBasicTurret, CTurret, CTurret, CTurret, CTurret]//啊,我会用它的基本炮塔。

当不再需要时:
Array[CTurret, CTurret, CTurret, CTurret, CTurret]//回到原点。

到目前为止,我只能看到两个选项来实现我想要的:
1) 我可以将所有炮塔类型放在基本类中,然后将其从基础更改为……实际类。但这会很快变得困惑。
2) 我可以为每种炮塔类型保留内存,这不是理想的情况,因为内存很宝贵,不应该这样浪费。此外,用户可能会要求比已经保留的更多的东西,这可能会带来 future 的问题。

最佳答案

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

一般的选择是多态基类(派生类覆盖继承的虚函数以专门化行为)或具有状态的单个类(例如,描述操作模式的枚举类型,描述速度的 float 等)。

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

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

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

关于C++ Runtime类切换,依赖基类继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28459944/

相关文章:

javascript - 重新添加元素的 jQuery 类更改

java - 使用java运行时(在Windows机器上)将Linux命令发送到Linux服务器

c++ - 类构造函数和数组

java - 如何在Windows中获取扩展的默认应用程序[Java]

C++11 std::regex Lookbehind 替代方案

c++ - 在C++中获取堆数组的大小

c++ - 模板化链接不适用于 -O2,但适用于 -O0

c++ - 在另一个类中创建类对象数组

c++ - Ciclic类在另一个类中使用

python - 使用 openssl/bn.h 将 c++ 痛饮到 python