即使从相同的类函数,C ++也无法访问私有类变量

时间:2014-03-21 23:52:05

标签: c++ class private

所以我正在制作一个二十一点游戏的程序。我为游戏中的每个玩家开了一个名为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);
  }
}

2 个答案:

答案 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;