[英]In C++, How do I store values into a vector that is inside of a vector when the two vectors are of different types?
[英]How do I store and use different classes in a vector in c++
我只想從一開始就說我對編碼仍然很陌生,而且我一直在嘗試進行研究,但由於無法找到我想要的東西而被卡住了。
我正在嘗試制作我的第一款游戲,一個簡單的文字冒險游戲。 我試圖制作一個球員的清單,所以我開始使用自定義類的向量。 經過一番研究,我發現我需要創建一個包含多個類的基類。
僅供參考,我正在使用
vector<item*> inventory;
class Map : public item
{
public:
void print();
virtual string getName(){return name;};
private:
string name = "Map";
};
class Compass : public item
{
public:
virtual string getName(){return name;};
private:
string name = "Compass";
};
class item
{
public:
virtual string getName(){return name;};
private:
string name = "item";
};
這在我的頭文件中,並且我有在其上擴展的cpp
文件。
當存儲它時,我發現我必須添加虛擬函數來獲取名稱,因此我添加了一個名稱數據成員並創建了getName()
函數並將其虛擬化。 最終,我能夠取出物品並獲得名稱,但是后來我發現了一個新的問題,找不到答案。
編輯:
使用inventory.push_back(&map)
,嘗試調用(inventory[0])->print()
會給我錯誤“項目中沒有打印成員”
結束編輯
我的map
類具有print()
函數,我需要從向量中使用它。 我是否必須在我的item
類中創建一個虛擬print()
函數,以便它可以使用虛擬部件向下傳遞,或者是否有更簡單的方法?
抱歉,如果這很簡單或很愚蠢,當我進行研究時,我發現所有的人都在試圖查找名稱和事物,但是如果沒有基類中的方法,我將找不到方法。
為了多態使用基類的任何子類,您將傳遞一個指向基類的指針或引用,並通過該指針或基類調用其虛擬成員函數。
您應該仔細考慮其他選擇,例如將Plain-Old-Data存儲在vector
而不是將所有類都存儲在類中。 子類之間實際上有多少種方法會有不同的實現?
您可以使用的一種數據結構是std::vector<std::unique_ptr<item> >
。 您將創建諸如std::unique_ptr<item>(static_cast<item*>(new compass))
,或者作為快捷方式inventory.emplace_back(...)
。 這將自動處理內存管理。 然后,您可以調用諸如inventory[0]->getname();
。 但是,請確保析構函數~item()
是virtual
,即使它只是virtual ~item() = default;
。 否則,將調用錯誤的析構函數!
另一種選擇是std::variant
,STL替換標記的聯合。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.