Я немного неопытен в 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-кода, так почему это происходит здесь и как я могу это исправить? Я полностью потерян.
Он никогда не используется, потому что вы пишете в переменную, но никогда не читаете из нее. Наличие переменной, которую вы никогда не читаете, фактически бессмысленно.
Предположительно ваш 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
как вы используете который подписан. это пост может быть полезным.
Других решений пока нет …