为什么我的对象中的变量被重置为默认值?

时间:2016-02-14 23:16:23

标签: c++ arduino

我正在尝试使用LCD键盘屏蔽在Arduino上写下国际象棋时钟。我几乎完全不熟悉C ++,我觉得我在处理类对象方面遇到了麻烦。

在我的代码中,我有一个菜单,允许玩家通过按下键盘上的左右按钮来改变他们可用的时间。这似乎首先起作用,但当我切换到另一个播放器并使用向上和向下按钮再次返回时,minutes变量将重置为默认值5分钟。

我对Player对象的处理方式缺少什么?

boolean menuActive = true;

class Player {
  // Represents a player.
  public:
    int minutes;              // number of minutes allowed
    void IncrementMinutes();   
    void DecrementMinutes();   
};

void Player::IncrementMinutes() {
  this->minutes += 1;
}

void Player::DecrementMinutes() {
  if (this->minutes > 1) {
    this->minutes -= 1;
  }
}

Player p1 = {5, false, 1, "P1 mins: ", 0};
Player p2 = {5, false, 2, "P2 mins: ", 0};

Player menuPlayer = p1;

void setup()
{
 lcd.begin(16, 2);  
 lcd.setCursor(0,0);
 lcd.print("ChessClock");
}

// Main loop
void loop()
{
 lcd_key = read_LCD_buttons();  
 if (menuActive) {
   switch (lcd_key)               
   {
     case btnRIGHT:
       {
        // increase minutes
        menuPlayer.IncrementMinutes();        
        delay(250);        
        break;
       }  
     case btnLEFT:
       {
        // decrease minutes        
        menuPlayer.DecrementMinutes();        
        delay(250);        
        break;
       }  
     case btnUP:
       {
        // select player 1
        menuPlayer = p1;
        break;
       }  
     case btnDOWN:
       {
        // select player 2
        menuPlayer = p2;
        break;
       }  
     case btnNONE:
       {
       // display the current value for minutes
       lcd.print(menuPlayer.minutes);
       break;       
       }
     }
 } else {
   // Main timer code
   }
}

1 个答案:

答案 0 :(得分:1)

您正在为玩家制作副本

// The actual players
Player p1 = {5, false, 1, "P1 mins: ", 0};
Player p2 = {5, false, 2, "P2 mins: ", 0};

// A COPY of player 1
Player menuPlayer = p1;

当您拨打电话时

menuPlayer.IncrementMinutes(); 

您只需更改menuPlayer,而不是p1p2。所以,当你做以下

menuPlayer = p2;

menuPlayer所做的所有更改都将丢失,您需要制作新副本。

您可以在交换前将menuPlayer复制到p1来解决此问题:

p1 = menuPlayer;
menuPlayer = p2;

或者menuPlayer Player*

// Point to p1:
Player* menuPlayer = &p1;

// Changes p1
menuPlayer->IncrementMinutes();