簡體   English   中英

c ++:可以使用父類構造函數在子類中初始化數據嗎?

[英]c++: Can you initialize data in a child class using the parents constructor?

我試圖找出是否可以使用由父類構造函數初始化的數據,然后使用它填充子類向量。 我一直在尋找這樣的東西,但最接近的是使用Parent構造函數初始化一個子類 ,但不幸的是這沒有幫助。

我的父母班級看起來像這樣

class Pile
{
protected:
    vector<int> cards;

public:
  Pile();

  vector<int> getCards();
  void shuffleDeck();
  void dealHand();

  void displayGame();
};

子班:

class Hand : public Pile
{
protected:
  deque<int> hand1;
};

它的實現:

#include "Declarations.h"
Pile::Pile()
{


  for(int i = 1;i <= 52; i++)
    cards.push_back(i);


  shuffleDeck();

  // What I would like to do.
  // dealHand();

}

理想情況下,我創建一副紙牌,將其洗牌,然后將它們分發到需要放置的位置(子類)。 我知道如何通過實例化子類,為它們創建方法並從父類傳遞向量來做到這一點,但這似乎很糟糕。

您能給我展示一種無需實例化Hand就將一個元素從“樁”類矢量“卡片”移動到其子類“手”的雙端隊列“ hand1”的方法嗎? 如果沒有,是否有比我的后備方法更直接的方法?

SomeCardsSomeCards紙牌。

class SomeCards {
  std::vector<int> cards;
public:
  SomeCards( std::vector<int> cards_in = {} ):cards(std::move(cards_in)) {}
  std::vector<int> allCards() const { return cards; }
  void shuffleCards(); // TODO
  SomeCards drawCards(std::size_t count) {
    std::vector<int> r;
    for(std::size_t i = 0; i < count; ++i) {
      if (!cards.empty()) {
        r.push_back(cards.back());
        cards.pop_back();
      }
    }
    return r;
  }
  void addCards( SomeCards in ) {
    cards.insert( cards.end(), in.cards.begin(), in.cards.end() );
  }
};

Hand牌是一些具有額外功能的卡。 另外,我們希望阻止交易。

class Hand : private SomeCards
{
public:
  using SomeCards::allCards;
  using SomeCards::addCards;

  using SomeCards::SomeCards;
  // TODO more?
};

Deck也是一些具有額外功能的卡:

class Deck : private SomeCards
{
public:
  using SomeCards::SomeCards;
  using SomeCards::shuffleCards;
  Hand drawHand(std::size_t size) {
    return drawCards(size);
  }
  std::vector<Hand> drawHands(std::size_t count, std::size_t size) {
    std::vector<Hand> r;
    r.reserve(count);
    for (std::size_t i = 0; i < count; ++i)
      r.push_back( drawHand(size) );
    return r;
  }
  std::size_t drawTo( Hand& hand, std::size_t count ) {
    auto cards = drawCards(count);
    hand.addCards( cards );
    return cards.size();
  }
};

然后,我們以此構建游戲:

class Game {
  Deck deck;
  std::vector<Hand> hands;
public:
  // TODO
};

注意SomeCards是從繼承而來的,但是是私下繼承的,因為我在上面進行了常見的操作(無法識別卡片的含義),並且我正在using SomeCards::operation將它們注入到私有子級中。

交替處理甲板和手是有問題的。

我們還可以從SomeCards剝離非常見功能並公開繼承。

這種設計使您可以編寫行為類似於Hand的簡單OrderedHand ,但對其進行改組是有意義的。

我沒有做太多的嘗試來避免上面不必要的副本。

基類構造函數在初始化派生類成員之前運行。 因此,只有那些成員具有微不足道的初始化,它才能修改它們; 否則,在成員的生存期開始之前使用成員將是不確定的行為。

我建議您以不同的方式設計類,以避免此類需求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM