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 の提案を使用) してすべて (一部) のベクトル インターフェイスを公開しない限り、必要な特定のベクトル メソッドを呼び出すメソッド (Cardpile インターフェイス) を提供する必要があります。何かのようなもの:

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

Private / Protected vs Public 継承の詳細については、こちらを参照してください。

C++ で実際に Private または Protected 継承が必要なのはなぜですか?

于 2012-11-24T16:05:33.647 に答える