我想在單個stl列表中存儲從相同基類派生的多個類類型。將多個派生類類型存儲在單個列表中
如果我使用
list<BaseClass> L;
然後當我添加任何派生類我的代碼編譯罰款。但是,它看起來像我的派生類在被存儲之前自動被轉換爲基本類型。顯然我想存儲派生類型的唯一成員。我怎樣才能做到這一點?
我想在單個stl列表中存儲從相同基類派生的多個類類型。將多個派生類類型存儲在單個列表中
如果我使用
list<BaseClass> L;
然後當我添加任何派生類我的代碼編譯罰款。但是,它看起來像我的派生類在被存儲之前自動被轉換爲基本類型。顯然我想存儲派生類型的唯一成員。我怎樣才能做到這一點?
你必須使用
list<BaseClass *> L;
但有了這個,你將有異常安全問題(你在哪裏銷燬對象當列表超出範圍?如果哪些異常之前拋出?) 。所以也許這樣:
#include <list>
#include <tr1/memory>
std::list<std::tr1::shared_ptr<BaseClass> > L;
會更好。可以找到TR1的基本信息,例如在wikipedia,其documentation 下的助推文檔。
+1顯示'tr1' –
@KirilKirov如果他提到這些智能指針也在C++ 11中,那它只會是+1,如果你不需要這些指針,你也可以使用'unique_ptr' 'shared_ptr'的開銷。我知道這可能不屬於答案,但實際上他是以智能指針開始的。 –
Christian Rau:我知道'shared_ptr'開銷。但現在它是唯一沒有附加庫(Boost)或不同標準(C++ 11)的解決方案。 –
您需要創建容器爲list< Baseclass* >
或
(「刪除」感謝@Cat Plus Plus的評論)list< Baseclass& >
(第二個是有點危險)。
通過使用list<Baseclass>
,您遇到了slicing issue。
您不能使用引用,因爲引用不可分配。 –
啊,對,謝謝! –
aaaaaand -1 for? –
爲了做到你想要的,你必須使用指針。一個可能的解決方案是std::list<BaseClass*>
但現在你必須處理複製,克隆,刪除。更好的選擇是使用Boost.Pointer Containers,這會自動爲你做。
我想你是指多個對象。 – leo