2011-04-29 64 views
0

我正在使用boost :: ptr_vector < class A>,我也用它來存儲類B的對象:public class A.我希望能夠訪問類B的對象在向量中;我如何施展才能獲得訪問權限?在boost :: ptr_vector中訪問派生對象

+0

事實上,你需要羽絨服是一種設計氣味。你應該改變你的設計,這樣做沒有必要。 – hifier 2011-04-30 02:23:01

回答

0

理想情況下,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元素)。

+1

如果容器中的所有對象都是(派生自)'B',則最好'dynamic_cast'指針,例如'dynamic_cast (&* s.begin())'。當類型不匹配時它會產生一個空指針,這與引發異常的引用類型不同。 – 2011-04-30 00:08:04

+1

在進一步閱讀時,請不要將'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

+1

@Ben:指針容器的'value_type'是'T *',但是迭代器是「自動解引用」(並且具有''T'的'value_type')。你說得對,在很多情況下,'dynamic_cast '會是可取的,尤其是因爲它可以作爲'if'的條件使用(例如'if(B * b_ptr = dynamic_cast (&* s.begin ())){}'),它提供了一個隱式的空檢查。 – 2011-04-30 00:15:15

相關問題