我使用C ++编程,无法弄清楚如何访问父类中的STL容器。我有以下课程:
class Card
class CardPile : private vector<Card*>
class Deck : public CardPile{Foo()}
我知道如果Foo()
在CardPile类中,我可以用size()
调用vector的大小。我如何从size()
调用vector Foo()
函数。
编辑:不幸的是,我不允许更改任何类定义
答案 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++?