C++ C++;Can';即使从同一个类函数也不能访问私有类变量

C++ C++;Can';即使从同一个类函数也不能访问私有类变量,c++,class,private,C++,Class,Private,所以我正在做一个21点游戏。游戏中的每个玩家我都有一个名为Player的类。问题在于Player.cpp中的这段代码: void Player::SetFunds(int amt){ cout << "setting funds:" << endl; cout << m_funds << "m_funds" << endl; m_funds = amt; cout << "done" << end

所以我正在做一个21点游戏。游戏中的每个玩家我都有一个名为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_基金,还有玩家类中的其他私人变量

 private:
  char* m_name;
  int m_funds;
  int m_bet;
  Hand m_hand;
  bool m_busted;
};
有什么我遗漏的吗?为什么即使我在一个播放器类函数中,我似乎也不能访问一个私有的播放器类变量?即使我在“设置资金”打印后立即出现分割错误,错误是否可能在其他地方

此外,我可以很好地更改构造函数中的私有变量,如下所示:

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;
}
Player::Player(字符*名称,整数金额){
m_name=名称;

cout嗯,
这个
指针似乎很奇怪

我建议使用此测试代码

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);
}
void Blackjack::SetPlayerFunds(整数玩家,整数金额)
{

cout您的问题在21点构造函数中

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);
  }
}
Blackjack::Blackjack(字符*名称[],整数层){
std::向量m_播放器;
m_经销商=玩家();
国际金额=100;
for(int i=0;i
您正在构造函数中的堆上创建m_player,分配和添加播放器,但可能从未初始化类中同名的真实成员


要解决此问题,请删除std::vector m_players;

使用调试器。
指针可能为空,即您正在对无效对象调用成员函数。调试器?是否有一个程序或我可以使用的东西?还有,什么是this指针?如果您
我可以这样做,并且我也不能打赌,会发生什么。看起来如此所有我无法访问的私有变量。“分段错误”与“无法访问”完全不同。如果你无法访问一个变量,编译器会在你运行程序之前给出一个错误。我将它改为“m_players.at(player).SetFunds(amt);”因为我使用的是std:vector。你是对的,它修复了
这个
。但是现在我得到了一个不同的错误:在抛出“std::out\u of_range”what()的实例后调用terminate::\M\u range\u checkAbort@seekerlite是的,我就是这么说的。
at()如果
player>=m_players.size()
我建议插入
试试{m_players.at(player.SetFunds(amt);}捕获(std::out_of u range&){std::cerr
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]);
}
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);
  }
}
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);
}
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);
  }
}