子类列表"master copies",寻找更好的设计
List of subclass "master copies", looking for a better design
我最近参与了一个小型游戏项目,在该项目中,玩家将在某个时刻获得一个随机项目。这些项(大约50个)被实现为虚拟Item
接口的子类。我们需要一种方法来随机选择其中一个项目,并为玩家提供特定类的实例。
我们的解决方案是创建一些容器(例如std::list
),并插入我们实现的每个项的实例。项目实现必须提供一个复制构造函数,这样我们就可以为获得该项目的玩家创建一个副本。瞧!
缺点很明显:很容易忘记插入项,而对复制构造函数的疏忽可能会导致不那么容易跟踪的错误。由于这是原型代码,我们没有太多麻烦,但我想知道是否有更漂亮的方法。理想的解决方案包括:
- 在某处自动"注册"项目
- 一种随机选择一个项目并实例化它的方法
- 无需为每个项编写复制构造函数
感谢您的提示和建议!
Daerst
您可以创建一个工厂来创建项目。然后,工厂还会在容器中注册创建项。我想为玩家使用共享指针!但这取决于你。
通过这种方式,您可以确保项目将通过单个界面创建。而且用于插入项目等的通用逻辑也是在一个地方实现的。
您的问题中有一些细节不清楚。例如,根据我对你的问题的解释,你似乎在硬编码你的物品的细节?基于你目前的原型是硬编码你的游戏物品的细节的假设,我会:
-
将内容与代码分离-这一点很重要,因为更改内容值需要重新编译,或者更重要的是,项目总数的扩展很快就会变得繁重且容易出错。
-
创建一个泛型类,该类表示一个具有所有适当字段的项,这些字段是用该项的相关详细信息填充该项类所必需的。
2A。若你们的项目并没有相似的属性,你们可以使用某种自定义方面的自我描述数组。例如,项目A是唯一的,并且具有风味特性。你会有一个二维数组[1][2],它的值是[1][1]=味道[1][2]=蓝莓。
-
创建一个充当项容器的类。
-
在容器类中,实现一个方法来实例化一个随机项(从数据库或其他存储机制中提取有关该项的详细信息),并将其添加到"已加载项"的容器集合中-有效地"注册"它。拥有这个容器类的两个明显好处是,一旦加载了一个项,如果你选择另一个随机项目,恰好是已经加载的项目,你不必再加载它。其次,在加载完整个项目集之前,你使用的内存更少。
-
在容器类中,实现一个将实例化项复制到播放器类的方法。-或者,在容器类中创建一个接口,玩家类实现该接口来请求一个新的随机项,然后调用该方法来实例化一个随机项。
希望这对你的头脑风暴有所帮助!
- 将项添加到
Item
类的constructor
内的vector
中。这样你就不需要"手工"添加每一个项目,它们将在创建时添加 - 与其复制项,不如让它们成为singleton类,而不是"给"用户一个项,只需使用指向
vector
中某个位置的指针
也就是说,你的问题与游戏的糟糕设计密切相关。项不应该是派生类,而应该是泛型项类的实例。但既然其他人已经提到了,我认为再输入一次对你没有任何帮助:)
- C++:将控制台输出存储在宏中更好吗
- FFmpeg:制作一个应用程序比直接使用ffmepg更好吗
- 初始化具有非默认构造函数的std::数组项的更好方法
- 有没有比在库中添加一个并非由所有派生类实现的新虚拟函数更好的设计实践
- 为什么新的随机库比std::rand()更好
- 寻找一种更好的方法来表示无符号字符数组
- 哪种方法更好,性能明智
- 什么更好?返回对象指针列表?或返回指向对象列表的指针?
- 什么是更好的做法?通过指针或标识符传递类成员?
- 寻求更好地理解标准::访问
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 寻找更好的方法来编写这个程序 C++
- 如何设置获取类的私有成员:寻找更好的方法
- <thread> 在 C++/CLI 代码中包含的代码中使用。寻找更好的解决方案
- 子类列表"master copies",寻找更好的设计
- 寻找更好的回溯系统
- 寻找更好的数据排序方法
- 寻找字符串模式的更好解决方案
- 寻找遍历图中所有顶点的路径的更好算法是什么?
- 在C++中寻找比虚拟继承更好的方法