сброс логического значения на следующей итерации цикла - PullRequest
0 голосов
/ 23 ноября 2018

Сейчас я беру уроки по C ++, C # и Java, поэтому я думаю, что некоторые вещи перепутаны.У меня проблемы с установкой значения bool для объектов, и что странно, это то, что значения int, которые я устанавливаю для других объектов, сохраняют изменения.Я изначально настраиваю его в функции внутри 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; }

edit: Сокращенный код до того, что, я думаю, имеет отношение к вопросу.

1 Ответ

0 голосов
/ 23 ноября 2018
Cell currCell = `gameBoard.getCellObject(cellNumber);`

Это создание нового объекта, локального для цикла while.Копия исходного объекта.

void DisplayPlayerInfo(Player &player, Cell &prop) {

Передача этого нового объекта по ссылке в функцию, поэтому он сохраняет измененные значения после выхода из функции.Однако эти новые измененные значения не сохраняются в исходном объекте, поэтому, когда цикл заканчивается, локальный объект уничтожается вместе с этими измененными значениями.Измените gameBoard.getCellObject(cellNumber);, чтобы вернуть ссылку вместо копии исходного объекта, чтобы устранить проблему.Cell &getCellObject(int i);

...