2016-08-15 103 views
-3
class element 
{ 
public: 
    element(); 
    virtual void foo() = 0; 
}; 

class bar : public element 
{ 
public: 
    bar(); 
    void foo() override 
    { 
     // Stuff 
    } 
}; 

class baz : public element 
{ 
public: 
    bar(); 
    void foo() override 
    { 
     // Stuff 
    } 
}; 

我想将bar的实例和baz的实例存储在同一个向量或列表中。存储抽象对象的实例

vector<element> elements; 
bar a = bar(); 
baz b = baz(); 

elements.push_back(a); 
elements.push_back(b); 

我知道上面的代码不会工作,但这种结构的东西是我在找的东西。

我读了一个地方,你可以存储一个向量unique_ptr< element>,但我无法弄清楚如何将bar或baz的实例转换为元素的唯一指针。

道歉,如果这是重复的,我试着寻找一个解决方案,但我找不到任何东西。

+1

你知道如何创建* any * ['std :: unique_ptr'](http://en.cppreference.com/w/cpp/memory/unique_ptr)对象吗?从那里开始,然后想想它将如何存储在你的向量中。 –

+0

是否[这](http://stackoverflow.com/questions/17417848/stdunique-ptr-with-derived-class)回答你的问题: –

+0

我认为你在这里失踪的主要观点是如何使用继承和多态性,例如如果您需要多态处理,您必须使用指向基类的指针或引用来指向/引用派生类。在这里使用'std :: unique_ptr'来保存对象的细节只在第一个点之后出现。 –

回答

2

使用std::make_unique创建由unique_ptr管理的对象。

std::vector<std::unique_ptr<element>> vector; // Empty vector 

vector.push_back(std::make_unique<bar>()); // Push a new bar 
vector.push_back(std::make_unique<baz>()); // Push a new baz 
+0

如果我已经有一个酒吧或巴兹的实例,该怎么办?我是否必须创建一个新实例? –

+0

@ConradJLudgate是的。一个实例只能存在于一个地方,所以你必须复制(或移动)它。 'make_unique'将其参数转发给新实例的构造函数,所以你可以使用'std :: make_unique (a)'从'a'(或''std :: move(a))复制构建新的'bar'。 '移动 - 构建它)。 – Quentin