【问题标题】:C++ struct with template in vector向量中带有模板的 C++ 结构
【发布时间】:2013-12-18 13:50:42
【问题描述】:

我正在用 C++ 制作文字冒险游戏。这是该游戏中对象的结构(用户可以拾取并放入库存中)

template <int N>
struct Object
{
    static const int length = N;
    string names[N];
    string description;
};

对象示例:

Object<2> flower = { {"flower", "the flower"}, "A strange looking flower"};
Object<3> book = { { "the book", "book", "recipe book" }, "The world's finest cocktail recipes now all in one easy to use companion." };

多个名称是命令解析器的同义词,因此用户可以输入“pick up book”或“pick up recipe book”,这两种情况下都会选择对象book。

现在我想创建一个矢量清单来存储清单中的所有元素。

vector<Object> inventory;

现在,当然,这给了我一个编译器错误,因为它需要这样的东西:

vector<Object<5>> inventory;

但是,有些对象的名称比其他对象多,这样的事情可能吗?如果可以,怎么办?

vector<Object<N>> inventory;

【问题讨论】:

  • 为什么需要保留 N 作为模板? , 如果 N 不同那么你可以使用std::vector&lt;string&gt; names 而不是string names[N]
  • 现在似乎对用 cmets 写答案很着迷!

标签: c++ arrays templates struct


【解决方案1】:

你所有不同的Object&lt;N&gt; 类都是不同的类型和不同的大小。您不能将它们放在 同质 容器中。

你需要一些基类或基接口,并在向量中存储指针,当你拉出元素时依赖于虚拟调度和多态性。这将使您的 Objects 容器成为 异构 容器。

或者,最好删除模板并将名称存储在成员容器中:

struct Object
{
    set<string> names;
    string description;
};

vector<Object> easy;

PS。我不认为 Objectany 类的好名字。 CompuChipInventoryItem 的建议更有意义。

【讨论】:

  • +1 作为替代解决方案,我认为这是最好的。关于使用Object 作为类名的评论。我可以推荐一些描述性的东西吗,比如InventoryItem
  • @CompuChip:我喜欢你的建议。
  • @NielsKeurentjes:在游戏中可能是描述性的,但在代码中不是描述性的。
  • @NielsKeurentjes 我来自 Java/C# 世界,它没有比 object 更通用的了。对我来说,这相当于“它真的可以是任何东西,我不知道它是什么或它甚至具有什么属性”。如果InventoryItem 过于局限,那么有可能提出比CarryableItemInteractableItemNamedWorldItem 更差的替代方案——所有这些都比object 恕我直言。
【解决方案2】:

vector 需要知道它包含的对象的大小,因此显然它不能允许在内部变化模板实例 (sizeof(Object&lt;N+X&gt;) &gt; sizeof(Object&lt;N&gt;))。

从主 Object 结构中删除模板化数组,并将其替换为常见的 vectorliststring 对象,您的问题就解决了。

【讨论】:

    【解决方案3】:

    从 BaseObject 导出对象,并形成一个指向 BaseObject 的智能指针向量:

    struct BaseObject
    {
       virtual ~BaseObject() = default;
    };
    
    template<int N>
      struct Object : public BaseObject
    {
       static const int length = N;
       string names[N];
       string description;
    };
    
    typedef shared_ptr<BaseObject> Objptr;
    vector<Objptr> Inventory(1006);
    

    【讨论】:

      猜你喜欢
      • 2011-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-22
      • 1970-01-01
      • 2013-05-30
      • 2020-06-25
      • 1970-01-01
      相关资源
      最近更新 更多