【问题标题】:Iterator not accessible because of private inheritance由于私有继承,迭代器无法访问
【发布时间】:2012-09-21 15:27:35
【问题描述】:

我创建了一个新类,它通过私有继承组成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>'

所以问题是,我怎样才能使迭代器可访问?

【问题讨论】:

  • @TonyTheLion 你所说的不适用于私有继承,因为不能将B 多态绑定到std::deque 指针或引用。
  • @juanchopanza: 同意,尽管注意B 类可以,如果它这么愚蠢,那么B 的作者需要小心。 B 类的用户不能,至少不能没有不安全的技巧,他们应该知道比使用更好。我认为 C 风格的转换可以做到这一点,但是无论标准容器是私有基地、公共基地还是根本不是基地,紧随其后的 C 风格演员 delete 都会中断!
  • @TonyTheLion: they won't destroy properly when inherited from - 这听起来像是货物崇拜编程。您的担忧仅适用于派生类通过基类指针销毁的情况。这对于私有继承是不可能的。
  • @FrerichRaabe:是的,你是对的,我错了。我不知道私有继承本质上与组合相同。
  • FWIW,您可能不应该将其视为“使iterator 可用”,您应该将其视为“提供iterator”,因为B 是使用@ 实现的987654334@,自然可以是deque::iterator。不过,最终的结果是一样的。

标签: c++ stl std inner-classes


【解决方案1】:

你必须提升这个迭代器类。

在公共部分使用使用关键字。

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

其他类型以及实现基类中的其他函数也是如此。

【讨论】:

  • 不,你只是不继承自 STL 容器
  • @TonyTheLion 私有继承是 C++ 语言的一部分。从设计的角度来看,也许组合比这更好 - 但这更容易使用。
  • 唯一真正的问题是,如果您尝试将对象视为多态的 STL 容器,而如果您是私有继承,则不会这样做。 STL 容器可能没有虚拟析构函数,所以你最终会分割你的对象。
猜你喜欢
  • 2011-12-22
  • 1970-01-01
  • 2020-02-07
  • 2018-04-21
  • 1970-01-01
  • 2018-12-12
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多