簡體   English   中英

如何在C ++中的向量中存儲和使用不同的類

[英]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.

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