2

現在、C ++用のポーカーゲームに取り組んでいますが、クラスオブジェクトの1つのデータメンバーを適切に更新するのに問題があります。ゲームは現在、ゲーム、プレーヤー、ハンド、カードの4つのクラスを使用しています(私はまだハウスクラスに焦点を合わせていません)。ゲームにはPlayerオブジェクト(ユーザーが定義した数)が含まれ、PlayerにはHandオブジェクトが含まれ、HandにはCardオブジェクト(プレーヤーごとに2枚のカード)が含まれます。これが私がこれまでに持っている関連するコードです:

ゲームは、main()から新しいGameオブジェクトを介してすぐに実行されます。プレーヤーの数とプレーヤー名が各プレーヤーオブジェクトに割り当てられると、プレーヤー情報が表示されます(テスト目的で)。

#include <iostream>
using namespace std;

Game::Game() : numPlayers(0), players(NULL)
{
    numPlayers = promptNumPlayers();
    players = new Player[numPlayers];

    cout << endl;

    for (int i = 0; i < numPlayers; i++)
    players[i].setName(promptName(i+1));

    play();
}

void Game::play()
{
    cout << endl;

    for (int i = 0; i < numPlayers; i++)
        cout << *(players+i); //displays incorrect hand
}

このカウトテストでは、プレイヤーの情報が正しく表示されます(同じカードですが、後で修正します)。これは、私のハンドクラスとカードクラスは今のところ大丈夫だと思いますが、必要に応じて投稿します。

Player::Player() : name(""), money(10000), playerHand(NULL)
{
    Hand newHand(NUM_CARDS);
    Hand *tempPtr = &newHand;
    playerHand = tempPtr;

    cout << *playerHand; //displays correct hand
}

ostream& operator<<(ostream &out, const Player &aPlayer)
{
    out << "\n* " << aPlayer.name << ": ";
    out << "$" << aPlayer.money << "  ";
    out << *(aPlayer.playerHand);

    return out;
}

ただし、play()関数では、プレーヤーの手は空白です。playerHandを不適切に更新しているかどうか、またはplay()で表示しようとしたときに一部のデータが破壊されているかどうかはわかりません。Playerのコンストラクターが正しくありませんか、それとも別の場所にコードを追加する必要がありますか?Hand用のセッターを使ってみましたが、今のところうまくいきません。

output演算子を変更してplayerHandのメモリアドレスを表示しても、プレーヤーのコンストラクターは正しいハンドを表示し、代わりにplay()がメモリアドレスを表示します。そうでなければ、私はそれが正しく動作すると思います。

他のプログラムの1つでも同様の問題が発生しましたが、自分で修正することができました。このデータを保持するためにこのプログラムで追加のクラスを使用しているため、この問題はもう少し複雑だと思います。

4

1 に答える 1

3

playerHandスタックに自動割り当てされているオブジェクトへの参照を割り当てています。

ヒープに割り当てる必要があります。

playerHand = new Hand(NUM_CARDS);

それ以外の場合は、コンストラクター内のスタックにハンドが割り当てられ、変数newHandがスコープ外になると、スタックがfredであるために解放され、ポインターplayerHandが無効になります。

デストラクタdelete playerHandでメモリを解放することを忘れないでください。Player

于 2013-01-05T02:56:18.147 に答える