[英]C++ struct with template in vector
我正在用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;
所有不同的Object<N>
類都是不同類型,大小不同。 你不能把它們放在一個同質的容器里。
你需要一些基類或基接口,並在向量中存儲指針,當你拉出元素時依賴於虛擬調度和多態。 這將使您的Object
容器成為異構容器。
或者,最好刪除模板並將名稱存儲在成員容器中:
struct Object
{
set<string> names;
string description;
};
vector<Object> easy;
PS。 我認為Object
不是任何類的好名字。 CompuChip對InventoryItem
的建議更有意義。
vector
需要知道它包含的對象的大小,因此很明顯它不允許在其中改變模板實例( sizeof(Object<N+X>) > sizeof(Object<N>)
)。
從主Object
結構中刪除模板化數組,並將其替換為公共vector
或list
或string
對象,並解決您的問題。
從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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.