2015-06-25 72 views
0

我有一個繼承層次結構。我的基類是一個抽象類。異構容器和句柄對象

 class A{}; 
     class B : public A{}; 
     class C : public A{}; 
     class D : public A{}; 
     class E : public A{}; 

我希望從子類B,C,D,E發送對象到矢量容器。

我知道,我可以爲了做到這一點創建一個句柄類。有人可以推薦一本很好的教程或文章,我可以閱讀它會告訴我如何做到這一點?

我知道我可以使用boost ::任何一個解決方案,但是我想嘗試解決這個使用句柄類。

謝謝。

+3

我不知道是否有可能提出比std :: shared_ptr更好的東西 marom

+1

「將子對象從子類B,C,D,E發送到矢量容器」究竟意味着什麼?我的意思是,你只是想做一個std :: vector 或其他東西? –

+0

你想讓容器擁有物體嗎?換句話說,當你刪除容器時你是否也想刪除這些對象?還是其他地方擁有的物品? –

回答

0

正如有人所說,std::vector<shared_ptr<A> >可能是最簡單的選擇。另外,boost :: variant是你可以看到的東西,但在這種情況下,所有類都具有共同的父類是沒有意義的。如果實際上計劃派生類中有任何數據成員,請不要忘記向A添加虛擬析構函數。

0

我的修訂後的答案!

 class A{}; 
     class B : public A{}; 
     class C : public A{}; 
     class D : public A{}; 
     class E : public A{}; 

B,C,D和E類具有類A作爲公共基類。簡單地定義容器來保存指向此基類A的指針。接下來,您將派生類對象存儲在容器中。通過將對象地址作爲元素存儲在容器中來執行此操作。可以通過多態使用類型A的指針來訪問容器中的對象。檢出虛擬構造函數成語。

+0

這通常是一個壞主意,因爲您必須手動管理向量中對象的生存期。如果可能的話,我建議使用像'shared_ptr <>'這樣的智能指針,而不是原始指針 – pqnet

0

你並不需要一個手柄或boost::any,指針A已經在這種情況下,最好的「處理」。所以你想要的是一個vector,其中包含A*,或更好的智能指針。

- 智能指針取決於所涉及的對象的生命週期。如果您需要包含的對象的生命週期與容器的生命週期無關(即容器不擁有所包含的對象,但僅僅引用它們),那麼shared_ptr<A>是您的最佳選擇。

另一方面,shared_ptr附帶有一個開銷,所以在對象的生命週期被容器的生命週期包含的情況下,它們只能通過從容器中檢索它們來使用(即容器擁有包含的對象),unique_ptr<A>可能是你最好的選擇。

(如果你的編譯器不支持unique_ptr呢,那麼你可以考慮尋找到了Boost指針容器庫,它提供了管理包含的對象的生命週期標準集裝箱。)

總之,你應該使用std::vector<std::shared_ptr<A>>std::vector<std::unique_ptr<A>>,具體取決於相關對象的生命週期。