我正在用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." };
多个名称是命令解析器的同义词,因此用户可以输入“拾取书籍”或“拾取食谱书”,在这两种情况下都会选择对象书。
现在我想创建一个矢量清单来存储清单中的所有元素。
vector<Object> inventory;
现在,当然,这给了我一个编译器错误,因为它需要这样的东西:
vector<Object<5>> inventory;
但是,有些对象的名字比其他对象多,有可能这样,如果有的话,怎么样?
vector<Object<N>> inventory;
答案 0 :(得分:11)
所有不同的Object<N>
类都是不同类型,大小不同。您不能将它们放在同质容器中。
你需要一些基类或基接口,并在向量中存储指针,当你拉出元素时依赖于虚拟调度和多态。这会使Object
的容器成为异构容器。
或者,最好删除模板并将名称存储在成员容器中:
struct Object
{
set<string> names;
string description;
};
vector<Object> easy;
PS。我不认为Object
是任何类的好名字。 CompuChip InventoryItem
的建议更有意义。
答案 1 :(得分:0)
vector
需要知道它包含的对象的大小,所以很明显它不允许在sizeof(Object<N+X>) > sizeof(Object<N>)
)内部改变模板实例。
从主Object
结构中删除模板化数组,并将其替换为常见的vector
或list
或string
对象,然后解决您的问题。< / p>
答案 2 :(得分:0)
从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);