调用STL容器的内置函数

时间:2012-11-24 15:34:58

标签: c++

我使用C ++编程,无法弄清楚如何访问父类中的STL容器。我有以下课程:

class Card
class CardPile : private vector<Card*>
class Deck : public CardPile{Foo()}

我知道如果Foo()在CardPile类中,我可以用size()调用vector的大小。我如何从size()调用vector Foo()函数。

编辑:不幸的是,我不允许更改任何类定义

2 个答案:

答案 0 :(得分:2)

size()CardPile的私有方法,但您可以,如果符合设计,则将其设为公开或受保护:

class CardPile : private std::vector<Card*>
{
 public: // or protected
  using std::vector<Card*>::size;
};

这将允许您在任何地方(公共)或派生类(受保护)中调用size()

但请记住,标准库容器并非设计为继承,特别是公开。因此,您可以更改CardPile类以容纳std::vector<Card*>数据成员。之后,如果您当前正在处理动态分配的Card对象,则可以考虑在向量中保存智能指针。

class CardPile : 
{
 public: // or protected
  std::vector<Card*>::size_type size() const { return cards_.size(); }
 private: 
  std::vector<Card*> cards_
};

答案 1 :(得分:1)

class Card {};

class CardPile : private std::vector<Card*> 
{};

class Deck : public CardPile
{
   public:
   void Foo(){this->size();} //FAIL
};

通过私下继承,你基本上是说你想要实现,但接口不是你想要公开的。所以你应该提供一个反映你正在建模的对象的界面。

因此,除非您公开继承(或使用juanchopanzas建议)来公开所有(某些)向量接口,否则您需要提供调用所需特定向量方法的方法(A Cardpile接口)。类似的东西:

class CardPile : private std::vector<Card*> 
{ size_t pileHeight() {return size(); };

这里有更多关于私人/受保护与公共继承的讨论:

Why do we actually need Private or Protected inheritance in C++?