2013-01-20 61 views
3

我想知道如果你可以將項目存儲到一個向量中,使用emplace_back,這是從矢量期望的類派生的類型。emplace_back和繼承

例如:

struct fruit 
{ 
    std::string name; 
    std::string color; 
}; 

struct apple : fruit 
{ 
    apple() : fruit("Apple", "Red") { } 
}; 

別的地方:

std::vector<fruit> fruits; 

我想存儲矢量內型蘋果的對象。這可能嗎?

+0

你忘了你的分號,skippy。 –

回答

9

否。矢量只存儲固定類型的元素。你想要一個指向對象:

#include <memory> 
#include <vector> 

typedef std::vector<std::unique_ptr<fruit>> fruit_vector; 

fruit_vector fruits; 
fruits.emplace_back(new apple); 
fruits.emplace_back(new lemon); 
fruits.emplace_back(new berry); 
+0

感謝您的快速響應。我有一個小問題,說我創建一個本地unique_ptr來存儲來自fruit_vector的對象,當該地方unique_ptr超出範圍時,地址上的內存不會被刪除嗎? – TheAJ

+2

@TheAJ:好的,這就是整個問題,對吧?如果你想保留該對象,將指針傳遞給容器... –

+0

在C++ 14中更優雅的方式是:'fruits.emplace_back(std :: make_unique ());' –

2

std::vector<fruit> fruits; 它只存儲水果不是派生類型的分配器僅適用於每個元素分配sizeof(fruit)水果。爲了保持多態,你需要在水果中存儲指針。

std::vector<std::unique_ptr<fruit>> fruits; 
fruits.emplace_back(new apple); 

蘋果是在免費商店動態分配的,當元素從矢量中刪除時會釋放。

fruits.erase(fruits.begin());