2016-05-02 21 views
0
class Base 
{ 
protected: 
    int x; 
public: 
    Base(); 
    ~Base(); 
    virtual void displayx(){ 
    cout << x << endl; 
    } 
}; 

class Derived:public Base 
{ 
public: 
    Derived(); 
    ~Derived(); 
    void displayx(){ 
    cout << x << endl; 
    } 
}; 

int main() 
{ 
Base * tanuki; 

tanuki = new Derived; 

//Unsure about these final lines of code. 
std::map< string, vector<Base*>> myMap; 

myMap.insert(make_pair("raccoon",vector<....*>())); 
} 

我希望能夠在myMap中存儲Derived的新實例。 然後用map中指定的標識符字符串調用displayx()函數。 我已經嘗試了多種東西,但我相信我已經碰到了一堵牆。使用派生類的向量圖

我該如何將基類'Base'的派生類'Derived'插入到我的矢量地圖中?

+0

我認爲你需要清楚你想達到什麼目的。例如從什麼派生出來的? – ppaulojr

+0

你想在地圖中的每個字符串的基*的*矢量*? – kfsone

+0

@kfsone我仍然試圖找出那行代碼的東西。我是否應該將它作爲矢量來實現我想要實現的目標? – Xirol

回答

1

鑑於

std::map< string, vector<Base*>> myMap; 

你有什麼是從字符串到基地的載體*指針的映射。因此,您需要查找映射到「racoon」的給定矢量,然後push_back。

auto& racoon = myMap["racoon"]; // reference to the vector 
racoon.push_back(tanuki); 

,你也可以寫爲

myMap["racoon"].push_back(tanuki); 

另一種可能性

auto it = myMap.find("racoon"); 
if (it == myMap.end()) 
    myMap.insert(std::make_pair<std::string, std::vector<Base*>>("racoon", {tanuki})); 
else 
    it->second.push_back(tanuki); 

(見http://ideone.com/Odgl2y

---編輯---

你想打電話displayx,這裏是你將如何調用displayx於載體上的浣熊所有元素:

auto it = myMap.find("racoon"); 
if (it == myMap.end()) { 
    // it->first is the key, it->second is the value, i.e the vector 
    for (Base* b : it->second) { 
     b->displayx(); 
    } 
} 

--- EDIT 2 ---

在C++ 98,以插入新如果你正在使用

typedef std::vector<Base*> Bases; // or BaseVec or something 
myMap.insert(std::make_pair<std::string, std::vector<Base*>>("racoon", std::vector<Base*>())); 

或:元素融入地圖,你可以這樣做你會寫

myMap.insert(std::make_pair<std::string, Bases>("racoon", Bases())); 

最後一部分是創建一個空矢量作爲第二個參數傳遞。

+0

非常感謝!是否可以調用displayx();使用你的第二種方法? – Xirol

+0

@Xirol看到我的編輯,那是你的意思嗎? – kfsone

+0

是的!謝謝。我只是很傷心,我不得不使用C++ 98,所以這是不可能的。汽車是在C++ 11中引入的嗎? – Xirol

1

對於這個特定的情況下,這是更簡單的比你想象的:

Base * tanuki= new Derived; 

std::map< string, vector<Base*>> myMap; 

myMap["racoon"].push_back(tanuki); 

operator[]讓你給定鍵的值的參考,值初始化一個新值,必要的。所以你可以免費獲得你的vector構造。然後你只需要將新元素(push_back)添加到向量中。