C++;向量中带模板的结构 我正在制作一个C++的文本冒险游戏。这是该游戏中对象的结构(用户可以拾取并放入清单) 模板 结构对象 { 静态常数int长度=N; 字符串名[N]; 字符串描述; };

C++;向量中带模板的结构 我正在制作一个C++的文本冒险游戏。这是该游戏中对象的结构(用户可以拾取并放入清单) 模板 结构对象 { 静态常数int长度=N; 字符串名[N]; 字符串描述; };,c++,arrays,templates,struct,C++,Arrays,Templates,Struct,对象示例: 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." }; objectflower={{“fl

对象示例:

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." };
objectflower={{“flower”,“theflower”},“一朵奇形怪状的花”};
ObjectBook={{“the book”、“book”、“recipe book”},“世界上最好的鸡尾酒配方,现在都集于一身,易于使用。”};
多个名称是命令解析器的同义词,因此用户可以输入“pick-up-book”或“pick-up-recipe-book”,这两种情况下都会拾取对象书

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

vector<Object> inventory;
矢量清查;
当然,这给了我一个编译器错误,因为它需要这样的东西:

vector<Object<5>> inventory;
矢量清查;
但是,有些对象的名称比其他对象多,这样的情况可能吗?如果可能,如何实现

vector<Object<N>> inventory;
矢量清查;

所有不同的
对象
类都是不同大小的不同类型。你不能把它们放在同一个容器里

您将需要一些基类或基类接口,并在向量中存储指针,这依赖于提取元素时的虚拟分派和多态性。这将使
对象的容器成为异构容器

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

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

vector<Object> easy;
struct对象
{
设定名称;
字符串描述;
};
向量容易;

< >我不认为<代码>对象< /代码>是任何类的好名字。
InventoryItem
的建议更有意义。

A
vector
需要知道它包含的对象的大小,因此显然它不能允许内部有不同的模板实例(
sizeof(Object)>sizeof(Object)


从主
对象
结构中删除模板数组,并将其替换为公共
向量
列表
字符串
对象,您的问题就解决了。

从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);
struct BaseObject
{
virtual~BaseObject()=默认值;
};
模板
结构对象:公共BaseObject
{
静态常数int长度=N;
字符串名[N];
字符串描述;
};
typedef共享\u ptr Objptr;
病媒清单(1006);

为什么需要保留N作为模板,如果N不同,那么您可以使用
std::vector names
而不是
字符串名[N]
现在似乎有一种在注释中写答案的痴迷+我认为这是最好的替代方案。关于使用
对象
作为类名的备注。我可以建议一些描述性的东西吗,比如
InventoryItem
?@CompuChip:我喜欢你的建议。@CompuChip
object
在这样的游戏中实际上是相当描述性的-物品也可能在房间里,或者用作设备,或者用作隐藏门等。@NielsKeurentjes:在游戏中可能是描述性的,但是它在代码中不是描述性的。@NielsKeurentjes我来自一个Java/C世界,在这个世界上,它没有比
对象
更一般的东西。对我来说,这相当于“它真的可以是任何东西,我不知道它是什么,甚至不知道它有什么属性”。如果
InventoryItem
过于有限,那么可能会提出比
CarryableItem
interactiableItem
NamedWorldItem
更糟糕的替代方案——所有这些都比
object
IMHO更好。
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);