2013-01-20 45 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());