我正在使用boost :: ptr_vector < class A>,我也用它來存儲類B的對象:public class A.我希望能夠訪問類B的對象在向量中;我如何施展才能獲得訪問權限?在boost :: ptr_vector中訪問派生對象
回答
理想情況下,A
應提供一個虛擬接口,允許您訪問您需要的B
的部分。如果您需要訪問實際B
對象,你就需要使用dynamic_cast
由一個迭代器產生的參考放入容器(你可以使用static_cast
如果你肯定知道,迭代器實際上指向一個B
對象):
// Create a container and insert a new element into it:
boost::ptr_vector<A> s;
s.push_back(new B());
// Get a reference to that element we just inserted:
B& b_ref = dynamic_cast<B&>(*s.begin());
如果你想遍歷所有在容器中的B
元素(並跳過任何非B
元素),你能做到這一點很容易使用Boost的transform_iterator
的組合(每個A&
轉換爲B&
)和filter_iterator
(跳過容器中的任何非B
元素)。
如果容器中的所有對象都是(派生自)'B',則最好'dynamic_cast'指針,例如'dynamic_cast (&* s.begin())'。當類型不匹配時它會產生一個空指針,這與引發異常的引用類型不同。 – 2011-04-30 00:08:04
在進一步閱讀時,請不要將'ptr_vector'迭代器引用到'T *'而不是'T&'? [文檔](http://www.boost.org/doc/libs/1_46_1/libs/ptr_container/doc/reversible_ptr_container.html)說'typedef T * value_type;'所以'dynamic_cast (* s.begin() )' – 2011-04-30 00:11:53
@Ben:指針容器的'value_type'是'T *',但是迭代器是「自動解引用」(並且具有''T'的'value_type')。你說得對,在很多情況下,'dynamic_cast
- 1. boost :: ptr_vector和克隆對象
- 2. 在另一個boost :: ptr_vector中推回boost :: ptr_vector <...> :: iterator?
- 3. 爲什麼boost :: ptr_vector的訪問元素嘗試實例化新對象?
- 4. 如何在`QQuickItem`派生類中訪問`QQmlApplicationEngine`的對象?
- 5. 如何從boost :: ptr_vector中刪除指針而不刪除對象?
- 6. 訪問派生對象中的繼承類
- 7. C++中派生類的對象可以被父類訪問嗎?
- 8. 來自Vector的派生類中的訪問對象
- 9. 訪問派生類
- 10. 訪問在派生類
- 11. 派生對象的boost序列化不調用派生的序列化()
- 12. Clearcase中的派生對象
- 13. 如何從抽象類訪問派生類對象升壓蟒蛇
- 14. boost :: ptr_vector如何深層複製底層對象?
- 15. 隨機分配給boost :: ptr_vector
- 16. boost上的多索引:: ptr_vector
- 17. boost :: ptr_vector排序函數
- 18. boost :: ptr_vector構造函數
- 19. 迭代通過boost ptr_vector
- 20. 的boost :: ptr_vector和指針
- 21. c#mongodb找到派生對象的派生對象
- 22. Python:如何通過派生類實例訪問父類對象?
- 23. 問題訪問派生類在陣列
- 24. 指向派生類對象的基類指針可以訪問在派生類中聲明的新成員嗎?
- 25. 在容器中查找派生對象
- 26. 如何在boost :: statechart state_machine對象中獲取當前最派生的狀態?
- 27. 錯誤LNK2005(已在對象中定義)使用派生類的boost序列化
- 28. 如何在boost :: spirit :: karma中訪問嵌套對象的數據?
- 29. 重置派生類對象
- 30. MVC2 ModelBinder的派生對象
事實上,你需要羽絨服是一種設計氣味。你應該改變你的設計,這樣做沒有必要。 – hifier 2011-04-30 02:23:01