簡體   English   中英

C ++結構與向量中的模板

[英]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不是任何類的好名字。 CompuChipInventoryItem的建議更有意義。

vector需要知道它包含的對象的大小,因此很明顯它不允許在其中改變模板實例( sizeof(Object<N+X>) > sizeof(Object<N>) )。

從主Object結構中刪除模板化數組,並將其替換為公共vectorliststring對象,並解決您的問題。

從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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM