【问题标题】:Calling STL container's built in function调用 STL 容器的内置函数
【发布时间】:2012-11-12 14:54:26
【问题描述】:

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

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

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

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

【问题讨论】:

  • 不要从标准容器继承,这是错误的。
  • 从技术上讲,来自标准容器的私有继承应该是相当无害的。但这仍然是不必要的和非惯用的。肯定会引起代码读者的一些反感。

标签: c++


【解决方案1】:

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

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

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

但请记住,标准库容器并非旨在继承,特别是公开继承。所以你可以改变你的CardPile 类来保存std::vector&lt;Card*&gt; 数据成员。之后,如果您当前正在处理动态分配的 Card 对象,您可能会考虑在向量中保存智能指针。

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

【讨论】:

  • 在您提供的第一个代码中,我有没有办法让所有 vector 的内置函数都可以访问? size 不是我唯一需要使用的。
  • @user44322 您可以将using std::vector&lt;Card*&gt;::method_name 用于要公开或保护的每个方法。
  • 我有办法将它们全部公开吗?每一个都不做?
  • 使用语法+1 - 我每天都在这里学习新东西
  • 当我使用您的第一个代码时,我得到:模板 ID 可能不会出现在 using-declaration 中
【解决方案2】:
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(); };

这里有更多关于 Private / Protected vs Public 继承的讨论:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 2023-03-03
    相关资源
    最近更新 更多