2012-09-21 40 views
3

的我已經創建了一個新的類,它通過私有繼承組成std::deque,即迭代器無法訪問,因爲私有繼承

class B : private std::deque<A> 
{ ... }; 

,在我的源代碼,我試圖用B的迭代器,即

B::iterator it 

編譯器錯誤是

error C2247: 'std::deque<_Ty>::iterator' not accessible because 'B' uses 'private' to inherit from 'std::deque<_Ty>' 

所以,問題是,我怎麼可以讓ITER ator可訪問?

+4

@TonyTheLion你說什麼並不適用於私有繼承,因爲一個不能綁定了''B''多形性成''的std :: deque''指針或引用。 – juanchopanza

+0

@juanchopanza:同意了,儘管注意到'B'類可以,如果它太愚蠢,那麼'B'的作者需要小心。 B類的用戶不能,至少不是沒有不安全的技巧,他們應該知道比使用更好。我認爲一個C風格的演員可以做到這一點,但是無論標準容器是私人基地,公共基地還是基地,一個C風格的劇組和後面的「刪除」都會中斷! –

+1

@TonyTheLion:「從'繼承'時它們不會被正確銷燬 - 這聽起來像貨物崇拜節目。您的關注僅適用於通過基類指針銷燬派生類的情況。這是私有繼承不可能的。 –

回答

13

你要推廣這個迭代器類。使用

使用公共部分關鍵字。

class B : private std::deque<A> 
{ ... 
public: 
    using std::deque<A>::iterator;  
}; 

對於其他類型以及實現基類中的其他函數也是如此。

+2

不,你只是不從STL容器繼承 –

+6

@TonyTheLion私有繼承是C++語言的一部分。從設計的角度來看,組合可能比這更好 - 但這更容易使用。 – PiotrNycz

+1

唯一真正的問題是,如果您試圖將對象作爲STL容器進行多態處理,如果您私下繼承,則不會這樣做。 STL容器可能沒有虛擬析構函數,所以你最終會切分你的對象。 – bstamour