C ++扑克游戏中的数据成员分配

时间:2013-01-05 02:53:46

标签: c++ class pointers

我目前正在为C ++开发扑克游戏,而且我无法正确更新其中一个类对象的数据成员。该游戏目前使用四个类:游戏,玩家,手牌和卡牌(我还没关注我的House类)。游戏包含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()将显示内存地址。否则,我认为它可以正常工作。

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

1 个答案:

答案 0 :(得分:3)

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

你应该在堆上分配它:

playerHand = new Hand(NUM_CARDS);

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

请记住通过delete playerHand析构函数中的Player释放内存。