2011-11-12 51 views
2

我想在單個stl列表中存儲從相同基類派生的多個類類型。將多個派生類類型存儲在單個列表中

如果我使用

list<BaseClass> L; 

然後當我添加任何派生類我的代碼編譯罰款。但是,它看起來像我的派生類在被存儲之前自動被轉換爲基本類型。顯然我想存儲派生類型的唯一成員。我怎樣才能做到這一點?

+0

我想你是指多個對象。 – leo

回答

4

你必須使用

list<BaseClass *> L; 

但有了這個,你將有異常安全問題(你在哪裏銷燬對象當列表超出範圍?如果哪些異常之前拋出?) 。所以也許這樣:

#include <list> 
#include <tr1/memory> 

std::list<std::tr1::shared_ptr<BaseClass> > L; 

會更好。可以找到TR1的基本信息,例如在wikipedia,其documentation 下的助推文檔。

+0

+1顯示'tr1' –

+0

@KirilKirov如果他提到這些智能指針也在C++ 11中,那它只會是+1,如果你不需要這些指針,你也可以使用'unique_ptr' 'shared_ptr'的開銷。我知道這可能不屬於答案,但實際上他是以智能指針開始的。 –

+0

Christian Rau:我知道'shared_ptr'開銷。但現在它是唯一沒有附加庫(Boost)或不同標準(C++ 11)的解決方案。 –

1

您需要創建容器爲list< Baseclass* >

list< Baseclass& >(第二個是有點危險)。 (「刪除」感謝@Cat Plus Plus的評論)

通過使用list<Baseclass>,您遇到了slicing issue

+1

您不能使用引用,因爲引用不可分配。 –

+0

啊,對,謝謝! –

+0

aaaaaand -1 for? –

0

爲了做到你想要的,你必須使用指針。一個可能的解決方案是std::list<BaseClass*>但現在你必須處理複製,克隆,刪除。更好的選擇是使用Boost.Pointer Containers,這會自動爲你做。

相關問題