我现在正在使用C ++,C#和Java上课,所以我觉得我有些混乱。我在设置对象布尔值时遇到了麻烦,奇怪的是我在其他对象上设置的int值保持更改。我最初是在Main内部的函数中进行设置的。离开函数并返回Main函数后,这些值是正确的。在下一次迭代中,第一个对象仍然具有新值,但是第二个对象已还原为原始值。
这是我的Main函数中的循环
while (true) {
Player player = playerQueue.front();
//stores the current cell the player is on
int cellNumber = gameBoard.findCell(player.getCellNum())->nodeNumber;
Cell currCell = gameBoard.getCellObject(cellNumber);
//check cell property
if (currCell.getCanBuy() == false){
//pay the property owner
} else {
DisplayPlayerInfo(player, currCell);
}
}
玩家可以在这里购买电池。 Player对象的功能正确更改,但是Cell(prop)对象更改,但是在while循环迭代后恢复。
void DisplayPlayerInfo(Player &player, Cell &prop) {
if (input == "y" || input == "Y") {
if (player.getCurrency() >= prop.getPrice()) {
//buy property
prop.setCanBuy(false);
player.subtractCurrency(prop.getPrice());
player.addProperty(prop);
}
}
else if (input == "n" || input == "N"){
return;
} else {
//return error
}
}
分别是我的Player对象和Cell对象的设置器
//Player setter
void Player::setPlayerName(std::string name) { pName = name; }
void Player::setQueuePos(int q) { queuePos = q; }
void Player::setCellNum(int num) { cellNum = num; }
void Player::addCurrency(int amt) { currency += amt; }
void Player::subtractCurrency(int amt) { currency -= amt; }
//Cell setter
void Cell::setCanBuy(bool val) { canBuy = val; }
编辑:将代码简化为我认为与问题相关的内容。
答案 0 :(得分:0)
Cell currCell = `gameBoard.getCellObject(cellNumber);`
这将创建一个新对象,该对象位于while循环本地。原始对象的副本。
void DisplayPlayerInfo(Player &player, Cell &prop) {
这是通过引用将该新对象传递给函数,这就是为什么它在离开函数后仍保留更改后的值的原因。但是,这些新的更改后的值未存储在原始对象中,因此当循环结束时,本地对象将与这些更改后的值一起销毁。更改gameBoard.getCellObject(cellNumber);
以返回引用而不是原始对象的副本以解决此问题。 Cell &getCellObject(int i);