2

我目前正在为 C++ 开发一款扑克游戏,但无法正确更新我的一个类对象的数据成员。该游戏目前使用四个类:Game、Player、Hand 和 Card(我还没有专注于我的 House 类)。Game 包含 Player 对象(数字由用户定义),Player 包含 Hand 对象,Hand 包含 Card 对象(每个玩家两张牌)。这是我到目前为止的相关代码:

游戏立即通过新的 Game 对象从 main() 运行。在将玩家数量和玩家名称分配给每个玩家对象后,将显示玩家信息(用于测试目的)。

#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
}

在这个 cout 测试中,玩家的信息显示正确(虽然是相同的牌,但我稍后会修复)。我想这意味着我的手牌和卡片类目前还可以,但如有必要,我会发布它们。

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 使用 setter,但到目前为止还没有成功。

如果我将输出运算符更改为显示 playerHand 的内存地址,玩家的构造函数仍将显示正确的手牌,而 play() 将改为显示内存地址。否则,我认为它可以正常工作。

我在我的其他程序之一中遇到了类似的问题,但我能够自己解决它。我认为这个问题有点复杂,因为我在这个程序中使用了一个额外的类来保存这些数据。

4

1 回答 1

3

您正在分配对playerHand在堆栈上具有自动分配的对象的引用。

您应该在堆上分配它:

playerHand = new Hand(NUM_CARDS);

否则会发生什么是手被分配在构造函数内的堆栈上,当变量newHand超出范围时,它被释放,因为堆栈是 fred,所以指针playerHand不再有效。

记得通过delete playerHandinPlayer析构函数释放它的内存。

于 2013-01-05T02:56:18.147 回答