2

我正在用 C++ 编程,但不知道如何访问父类中的 STL 容器。我有以下课程:

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

我知道如果Foo()在 CardPile 类中,我可以用size(). 我将如何size()Foo().

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

4

2 回答 2

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_
};
于 2012-11-24T15:40:16.803 回答
1
class Card {};

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

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

通过私有继承,您实际上是在说您想要实现,但接口不是您想要公开的。所以你真的应该提供一个接口来反映你正在建模的对象。

因此,除非您公开继承(或使用 juanchopanzas 建议)来公开所有(部分)vectors 接口,否则您需要提供调用您需要的特定vector 方法的方法(A Cardpile Interface)。就像是:

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

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

为什么我们实际上需要 C++ 中的 Private 或 Protected 继承?

于 2012-11-24T16:05:33.647 回答