2016-08-15 53 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