2

タイトルが示すように、あるクラスから別のクラスにベクトルを送信しようとしています。サンプルコードを次に示します。

class Deck
{
    public:

    //constructor
    Deck(){}
    ~Deck(){} //deconstructor

//global for setting deck size
int SetDeckMultiplier;

    //Card SetUp
            //access vector
        std::vector<int> GetCopyOfVector(){return cards;}
            //set deck size based on multiplier
        void SetDeckSize();
            //shuffle card vector
        void shuffle();

    //End Card Setup

     protected:

     private:
std::vector <int> cards;

};

これは基本的に、intをシャッフルするのではなく、ベクトルを設定し、intで埋めます。

私は2番目のクラスを持っています...

class Dealer: public Deck
{
  public:



  void Hit();
  void GetStoredDeck()
  {

    std::cout << cards.size() << std::endl;
  }
  void DealCard();
  void DealerScore();
  void IniDeal();
  void CardPositions();

  private:

};

ディーラーがintを使用できるように、ベクトルをこのクラスにプルしようとしています。ベクトルを保護することはできますが、.size()は0です。最初のクラスで塗りつぶされてシャッフルされた後、このクラスに渡す方法はありますか?

編集:

クラスの関数のコードはあまりありません。スケルトンのセットアップを行っていました。

Deck.cpp

void Deck::SetDeckSize()
{
      for (int i = 0; i < (52 * SetDeckMultiplier); i++)
        {
        cards.push_back(i);
        }

    //set card values
      for (int i = 0; i > (52 * SetDeckMultiplier); i++)
      {
        cards[i] =  i;

      }

}

void Deck::shuffle()
{
    for (int i = 0; i < (52 * SetDeckMultiplier); i++)
        {
       int r = i + (rand() % ((52 * SetDeckMultiplier) - i)); // Random remaining position.

       int temp = cards[i]; cards[i] = cards[r]; cards[r] = temp; //swap cards

       while (cards[i] >= 52) cards[i] = cards[i] - 52; //loop to ensure correct number for display

        //std::cout << cards[i] << std::endl;//display random cards.. for now
    }
}

これは、ベクトルを埋めて要素をシャッフルする必要があるコードです。

シャッフルされたベクトルをディーラークラスで使用したいと思います。このようにして、ディーラーはベクトル内の次の要素を取得し、それを使用して実行する必要があることを実行できます。

size()について私が言っていたのは、ベクトルをプライベートではなく保護すると、継承を介してベクトルを使用できるということですが、これは空のベクトルであり、塗りつぶされてシャッフルされたものではありません。

4

3 に答える 3

1

cardsコードから始めて (そして で保護されていると仮定してDeck)、次のように Dealer クラスを使用できます。

Dealer dealer;
dealer.SetDeckSize();
dealer.shuffle();
dealer.GetStoredDeck();

ただし、@ Troy が指摘したように、クラスの設計は見栄えがよくありません。ディーラーはデッキでDealerはないため、 のサブクラスであってはなりませんDeck。代わりに、Dealer次のように Deck クラスのフィールドを含める必要があります。

class Dealer
{
  public:
  void Hit();
  void DealCard();
  void DealerScore();
  void IniDeal();
  void CardPositions();

  private:
  Deck deck;
};
于 2013-01-08T05:52:30.773 に答える
1

あなたがする必要があるのは、デッキコンストラクターに作成カードを追加することです。cardsこれは、基本クラスと派生クラスの間で共有されるデータを示す単純なサンプルです。

class Deck
{
public:
  Deck() : cards{1,2} {}    // C++11 supports initializer list
  virtual ~Deck() {}        // better declare base destructor as virtual

protected:                  // derived class can access protected base members
  std::vector <int> cards;  
};

class Dealer: public Deck
{
public:
  Dealer()   // Deck default constructor is called 
  {
  }

  void GetStoredDeck()
  {
     std::cout << cards.size() << std::endl;
  }
};

int main(int argc, char* argv[])
{
  Dealer dealer;
  dealer.GetStoredDeck();   // you should see 2 cards now?
  return 0;
}
于 2013-01-08T05:40:10.760 に答える
0

cards派生クラスDealerでint ベクトルにアクセスするには、それを宣言する必要protectedがあります...

Deck::SetDeckSize()あなたのメソッド名から、 int を に入れる人だと思いますcards

したがって、 を呼び出す前にこのメソッドを呼び出していないと思いますDealer::GetStoredDeck()

于 2013-01-08T05:43:00.713 に答える