2012-09-21 115 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