2

10 年ぶりに C++ に戻ってきたので、ASCII BlackJack ゲームを試してプログラミングすることにしました。デックとプレイヤーの手の両方を保持するためにベクターを使用することにしましたが、2 枚のカードを DEALER ベクター ハンドと PLAYER ベクター ハンドの両方に割り当てる必要がある初期ディール関数を呼び出すと、カードは問題なく書き込まれますが、それが出てきて、後で手を印刷したいのですが、範囲外の例外が発生します。

以下のコードスニペット!

void deck::initialDeal(player dealer, player player1)
{
    for(int i = 0; i < 2 ; i++)
    {
        dealer.addHand(myDeck[i]);
        myDeck.erase(myDeck.begin());
        player1.addHand(myDeck[i]);
        myDeck.erase(myDeck.begin());
    }
}

上記は、メイン デッキから数枚のカードを取得し、addHand ルーチンを呼び出して、そのカードをプレイヤーのベクター ハンドに追加するだけです。

void player::addHand(card dealtCard)
{
    hand.push_back(dealtCard);
}

addHand 関数内に手のベクトルを出力するルーチンを入れると、正常に動作し、データが入れられたことがわかります。

ただし、後で手を画面に出力したいので、printHand() という別の関数を用意します。

void player::printHand()
{
    if (dealer == true)
    {
        cout << hand[0].getNumber() << hand[0].getSuit() << " ";
        cout << hand.size() << endl;
    }
    else
    {
        for(std::vector<card>::size_type x = 0 ; x != hand.size() ; x++)
        {
            cout << hand[x].getNumber() << hand[x].getSuit() << " ";
        }
    }
}

現時点では、ディーラー側を扱っているだけなので、関数のディーラー ブランチに入り、エラーが発生します。

addHand() 関数で作成されたデータは、完了すると削除されるため、ここでポインターを使用する必要があったのではないでしょうか?

4

1 に答える 1

6

すべての引数を参照ではなく copyで渡すようです(参照とはポインターを意味するものではありません)。これは、オリジナルではなくコピーのみを変更していることを意味します。

関数プロトタイプを次のように変更すると、次のようになります。

void initialDeal(player& dealer, player& player1)

引数は代わりに参照によって渡され、引数として渡される元のオブジェクトを変更できます。

于 2013-08-26T13:15:04.897 に答える