我正在用 C++ 编程,但不知道如何访问父类中的 STL 容器。我有以下课程:
class Card
class CardPile : private vector<Card*>
class Deck : public CardPile{Foo()}
我知道如果Foo()
在 CardPile 类中,我可以用size()
. 我将如何size()
从Foo()
.
编辑:不幸的是,我不允许更改任何类定义
我正在用 C++ 编程,但不知道如何访问父类中的 STL 容器。我有以下课程:
class Card
class CardPile : private vector<Card*>
class Deck : public CardPile{Foo()}
我知道如果Foo()
在 CardPile 类中,我可以用size()
. 我将如何size()
从Foo()
.
编辑:不幸的是,我不允许更改任何类定义
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_
};
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(); };
这里有更多关于私有/受保护与公共继承的讨论: