gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 06:26:27 26 4
gpt4 key购买 nike

我并不完全精通 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com