2

トランプを扱うことができる簡単なプログラムを作成しています。ハンドを作成するようになりましたが、問題が発生しました。ハンドが配られたときに、カードがデッキから削除されません。デッキは、スーツ、価値、色を含むカードオブジェクトのベクトルです。

これは私が書いた短いテストプログラムです。

Deck testDeck; //default deck is in order
cout << testDeck << endl; //print the deck out

Hand testHand(5, testDeck); //generate a hand of 5 cards from testDeck
cout << testHand << endl; //print the hand
cout << testDeck << endl; //print the deck

初期化されたデッキ

2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH AH 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD AD
2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS AS

デッキから5枚のカードのサンプルハンドを入手する

2H 3H 4H 5H 6H

デッキには5枚のカードがないはずですが、何も起こらなかったかのように最初のデッキを返すだけです。

2H 3H 4H 5H 6H 7H 8H 9H 10H JH QH KH AH 2D 3D 4D 5D 6D 7D 8D 9D 10D JD QD KD AD
2C 3C 4C 5C 6C 7C 8C 9C 10C JC QC KC AC 2S 3S 4S 5S 6S 7S 8S 9S 10S JS QS KS AS

これは私の手のコンストラクターです:

Hand::Hand(int numCards, Deck myDeck)
{
    myHand = myDeck.takeTopXCards(numCards);
}

takeTopXCards関数は次のとおりです。

vector<Card> Deck::takeTopXCards(int numCards)
{
    vector<Card> retCards;

    for(int i = 0; i < numCards; i++)
        retCards.push_back(takeTopCard());

    return retCards;
}

そしてもちろん、TakeTopCard関数:

Card Deck::takeTopCard()
{
    Card ret = myDeck[0];
    myDeck.erase(myDeck.begin());
    return ret;
}

消去を使用する前後にmyDeck[0](myDeckはDeckクラスのプライベートデータメンバー)を出力してtakeTopCard関数を確認しましたが、正常に機能します。何らかの理由で、takeTopXCardsが返されると、それに渡されるDeckオブジェクト(テストプログラムのtestDeck)は変更されません。

他に何か見たい場合は、質問してください。ここで最後に追加します。ありがとう。

4

1 に答える 1

2

これを変える:

Hand::Hand(int numCards, Deck myDeck)

これに:

Hand::Hand(int numCards, Deck& myDeck)

なぜ:

あなたはデッキをバリューバイバリューで渡します。これは、ハンドを配るときにそのコピーを作成します。コピーは削減されるものです。元のデッキはそうではありません。参照して渡すと、元のデッキが変更されます。

于 2012-12-31T22:28:47.750 に答える