子类列表“主副本”,寻找更好的设计

时间:2014-01-14 00:21:24

标签: c++ design-patterns architecture

我最近参与了一个小型游戏项目,玩家将在某个时间点获得一个随机项目。这些项目(约50个左右)是作为虚拟Item接口的子类实现的。我们需要一种方法来随机选择其中一个项目并将特定类的实例提供给播放器。

我们的解决方案是创建一些容器(例如std::list)并插入我们实现的每个项目的实例。项目实现必须提供复制构造函数,以便我们可以为获取项目的玩家创建一个副本。瞧!

缺点很明显:忘记插入项目非常容易,而对副本构造函数不小心会导致错误跟踪不容易。由于它是原型代码,我们没有太多麻烦,但我想知道是否有更漂亮的方式。理想的解决方案包括:

  1. 在某处自动“注册”项目。
  2. 随机选择一个项目并实例化的方法。
  3. 无需为每个项目编写复制构造函数。
  4. 感谢您的提示和建议!

    Daerst

3 个答案:

答案 0 :(得分:1)

您可以创建工厂来创建项目。然后工厂也会在容器中注册创建项目。我想为玩家使用共享指针!但这取决于你。

这样您就可以确保通过单个界面创建项目。插入项目等的通用逻辑也在一个地方实现。

答案 1 :(得分:1)

您的问题中有一些细节尚不清楚。例如,基于我对您的问题的解释,您似乎很难编写项目的具体内容?基于您当前原型的假设是硬编码您的游戏项目的详细信息,我会:

  1. 将内容与代码分开 - 这很重要,因为更改内容值需要您重新编译,或者更重要的是,扩展项目总数很快会变得繁琐且容易出错。

    < / LI>
  2. 创建一个泛型类,该类表示一个项目,其中包含使用项目的相关详细信息填充此项目类所需的所有相应字段。

  3. 2A。如果您的项目没有类似的属性,则可以使用某种自描述项目自定义方面的数组。例如,项目A是唯一的并且具有风味属性。你会得到一个二维数组[1] [2],其值为[1] [1] =风味[1] [2] =蓝莓。

    1. 创建一个充当项目容器的类。

    2. 在容器类中,实现一个实例随机项的方法(从数据库或其他存储机制中提取有关项的详细信息),并将其添加到“已加载项”的容器集合中 - 有效地“注册“它。拥有这个容器类的两个明显的好处是,一旦一个项被加载,如果你再选择一个恰好是已经加载的随机项,你不必再次加载它,其次,你使用更少的内存直到整个项目集已加载。

    3. 在容器类中,实现一个将实例项复制到播放器类的方法。 - 或者 - 在容器类中创建一个接口,玩家类实现该接口以请求一个新的随机项 - 然后调用该方法来实例化一个随机项。

    4. 希望这有助于你的头脑风暴!

答案 2 :(得分:0)

  1. 将项目添加到vector课程的constructor内的Item。这样您就不需要“手动”添加每个项目,它们将在创建时添加。
  2. 不要复制项目,而是将它们设为单身类,而不是“向用户”提供项目,只需使用指向vector内某个位置的指针。
  3. 话虽如此,你的问题与游戏的糟糕设计密切相关。项不应是派生类,而是泛型项类的实例。但是,由于其他人已经提到它,我不认为再次输入它对你有任何帮助:)