我对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代码没有发生这种情况,为什么会发生这种情况,我该如何解决呢?我完全迷失了。
答案 0 :(得分:6)
它从未被使用,因为你写入变量,但从未读过它。拥有一个你从未读过的变量实际上毫无意义。
大概你的game_state.getCurrentRoll
函数返回一个整数,当你存储它时,你存储值(而不是对值的引用),因此递增它不会增加当前值在game_state
内滚动,您应该向game_state
makeRoll
添加一个函数,例如,game_states
内部current_roll
值增加。
这与使用current_roll
直接递增game_state->current_roll++
值 的C代码不同(或者您可以将game_state.current_roll
公开并以相同方式递增就像你的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++;
}
...
}
然后你可以正常调用它。
关于错误的评论中关于您的新问题:
参数类型不匹配:对'int'类型的有符号值使用'unsigned long'。
这是因为at
的签名是std::vector::at( size_type pos );
也就是说,它期望类型size_type
的值是无符号整数类型,而不是int
'正在使用哪个签名。 This帖子可能会有帮助。