我目前正在为 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() 将改为显示内存地址。否则,我认为它可以正常工作。
我在我的其他程序之一中遇到了类似的问题,但我能够自己解决它。我认为这个问题有点复杂,因为我在这个程序中使用了一个额外的类来保存这些数据。