Увеличенная переменная «никогда не использовалась»?

Я немного неопытен в C ++, и я конвертирую программу, написанную на C, в C ++. У меня есть функция RollDice, которая берет числа, которые я прочитал из текстового файла, и использует их для генерации числа. Это функция в C:

void rollDice(Move *move, GameState *game_state) {
int diceNum1 = 0;
int diceNum2 = 0;
int randomNumber1 = 0;
int randomNumber2 = 0;
randomNumber1 = game_state->randomNums[game_state->current_roll]; //gets the random number from the array randomNum (which holds the numbers from the text file), at index "current_roll"game_state->current_roll++; //increments so the next random number will be the next number in the array
diceNum1 = 1 + (randomNumber1 % (1 + 6 - 1));
randomNumber2 = game_state->randomNums[game_state->current_roll];
game_state->current_roll++;
diceNum2 = 1 + (randomNumber2 % (1 + 6 - 1));
move->dice_sum = diceNum1 + diceNum2;
printf("You rolled a %d!\n", move->dice_sum);
}

Это работает так, как я хочу, когда я запускаю его. Теперь, когда я конвертировал свою программу в C ++, мне пришлось что-то менять. Мои параметры теперь передаются по ссылке, и я создал вектор для хранения списка случайных чисел из текстового файла:

void rollDice(Move& move, GameState& game_state) {
std:: vector<int> randomNums = game_state.getRandomNums();
int current_roll = game_state.getCurrentRoll();
int diceNum1 = 0;
int diceNum2 = 0;
int randomNumber1 = 0;
int randomNumber2 = 0;
randomNumber1 = randomNums.at(current_roll);
current_roll++;
diceNum1 = 1 + (randomNumber1 % (1 + 6 - 1));
randomNumber2 = randomNums.at(current_roll);
current_roll++;   //this line is grayed out and says "this value is never used"diceNum2 = 1 + (randomNumber2 % (1 + 6 - 1));
move.dice_sum = diceNum1 + diceNum2;
std:: cout << "You rolled a " << move.dice_sum << "!\n";
}

Мой код говорит мне, что во второй раз, когда я увеличиваю current_roll, он не используется. Этого не произошло для моего C-кода, так почему это происходит здесь и как я могу это исправить? Я полностью потерян.

3

Решение

Он никогда не используется, потому что вы пишете в переменную, но никогда не читаете из нее. Наличие переменной, которую вы никогда не читаете, фактически бессмысленно.

Предположительно ваш game_state.getCurrentRoll Функция возвращает целое число, когда вы сохраняете это, вы сохраняете значение (а не ссылка на значение), поэтому его приращение не увеличивает текущий бросок внутри game_stateвместо этого вы должны добавить функцию к вашему game_state называется makeRoll например, который увеличивает game_states внутренний current_roll значение.

Это отличается от вашего кода C, который увеличивает current_roll значение непосредственно с помощью game_state->current_roll++ (в качестве альтернативы вы могли бы сделать game_state.current_roll public и увеличивайте его так же, как в вашем коде C).

Из вашего комментария я предполагаю, что у вас есть класс:

class GameState {
private:
int current_roll;
...
public:
int getCurrentRoll() {
return current_roll;
}
...
}

Все, что вам нужно сделать, это добавить еще одну функцию в ваш класс, чтобы увеличить current_roll:

class GameState {
private:
int current_roll;
...
public:
int getCurrentRoll() {
return current_roll;
}
void makeRoll() {
current_roll++;
}
...
}

Тогда вы можете назвать это как обычно.


Относительно вашей новой проблемы в комментариях относительно ошибки:

несоответствие типа параметра: использование «unsigned long» для значений со знаком типа «int».

Это потому что подпись at является std::vector::at( size_type pos ); То есть он ожидает значение типа size_type который является целым типом без знака, а не int как вы используете который подписан. это пост может быть полезным.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]