所以我正在制作一个二十一点游戏的程序。我为游戏中的每个玩家开了一个名为Player的课程。问题在于这里的代码块在Player.cpp中:
void Player::SetFunds(int amt){
cout << "setting funds:" << endl;
cout << m_funds << "m_funds" << endl;
m_funds = amt;
cout << "done" << endl;
}
编译时,我遇到了分段错误。 “设置资金:”行打印,但我无法打印m_funds,也无法将其设置为amt(我在为m_funds添加print语句之前尝试过它)。
这是Player.h中的函数声明(包含在Player.cpp中)。
void SetFunds(int amt);
这里是我有m_funds的地方,以及Player类中的其他私有变量。
private:
char* m_name;
int m_funds;
int m_bet;
Hand m_hand;
bool m_busted;
};
有什么我想念的吗?为什么我似乎无法访问私有的Player类变量,即使我在Player类函数中?即使在“设置资金”打印后立即出现分段错误,错误是否可能在其他地方出现?
另外,我可以很好地更改构造函数中的私有变量,如下所示:
Player::Player(char *name, int amt){
m_name = name;
cout << amt << endl; //Amount prints as 100
m_funds = amt; // sets m_funds to 100
cout << m_funds << endl; //m_funds prints as 100 just fine
m_bet = 0;
m_hand = Hand();
m_busted = false;
}
编辑: 这是我在Blackjack.cpp中调用函数SetFunds的地方: (m_players是玩家的矢量,作为二十一点类的私人变量。)再次,amt couts to 100。
void Blackjack::SetPlayerFunds(int player, int amt){
cout << amt << endl;
m_players[player].SetFunds(amt);
}
这里是我从Project.cpp(包含main)调用该函数的地方: (注意:这是针对我无法编辑此文件并且必须以我的代码为基础的项目)
Blackjack *CreateGame(int argc, char *argv[]) {
char **names;
int *funds;
int numPlayers;
Blackjack *game;
numPlayers = ProcessArgs(argc - 1, &argv[1], names, funds);
game = new Blackjack(names, numPlayers);
for (int p = 0; p < numPlayers; p++) {
game->SetPlayerFunds(p, funds[p]);
}
编辑2: 这是Blackjack类构造函数,在Blackjack :: CreateGame中调用。
Blackjack::Blackjack(char *names[], int numPlayers){
std::vector<Player> m_players;
m_dealer = Player();
int amt = 100;
for(int i = 0; i < numPlayers; i++){
Player player(names[i], amt);
m_players.push_back(player);
}
}
答案 0 :(得分:0)
this
指针很奇怪..
我建议使用此测试代码。
void Blackjack::SetPlayerFunds(int player, int amt)
{
cout << amt << endl;
// if "m_players" is std::vector
m_players.at(player).SetFunds(amt);
// elif "m_players" is C-array
if (player >= sizeof(m_players)/sizeof(m_players[0]))
abort(); // assert(false) or setting breakpoint will be better, if you can use debugger
m_players[player].SetFunds(amt);
}
答案 1 :(得分:0)
您的问题出在Blackjack构造函数中。
Blackjack::Blackjack(char *names[], int numPlayers){
std::vector<Player> m_players;
m_dealer = Player();
int amt = 100;
for(int i = 0; i < numPlayers; i++){
Player player(names[i], amt);
m_players.push_back(player);
}
}
您正在构造函数的堆上创建m_player,分配和添加玩家,但可能永远不会在类中初始化同名的真实成员...
要解决此问题,请删除std :: vector m_players;