我目前正在为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()将显示内存地址。否则,我认为它可以正常工作。
我在其他一个程序中遇到过类似的问题,但我能够自己修复它。我认为这个问题有点复杂,因为我在这个程序中使用了一个额外的类来保存这些数据。
答案 0 :(得分:3)
您正在为playerHand
分配对堆栈上自动分配的对象的引用。
你应该在堆上分配它:
playerHand = new Hand(NUM_CARDS);
否则会发生的事情是在构造函数内的堆栈上分配了手,当变量newHand
超出范围时,它会被释放,因为堆栈是fred所以指针playerHand
不再有效。
请记住通过delete playerHand
析构函数中的Player
释放内存。