C++类成员函数执行时成员变量递增异常的技术求助
问题诊断与修复
我帮你找出了几个导致分数累加异常的关键问题,咱们一步步拆解:
1. 赋值运算符错误(最核心问题)
你写的this->pScore =+ distr(eng);是个典型笔误:=+并不是累加运算符,它的作用是将右侧值的正值赋值给左侧变量,相当于this->pScore = +distr(eng);。这就导致每次调用rollDice时,pScore都会被新的随机数覆盖,而不是在原有基础上累加。
正确的累加运算符应该是+=,也就是this->pScore += rolledValue;。
2. 重复生成随机数,导致显示与实际累加值不一致
在你的rollDice函数里,你连续调用了三次distr(eng):
- 第一次赋值给
playerDiceRolled - 第二次用来输出
- 第三次用来更新分数
这三次调用会生成三个完全不同的随机数,比如你输出的是5,但实际加到分数上的可能是2,这就会让你误以为分数累加没生效。正确的做法是只生成一次随机数,然后复用这个值。
3. 每次调用都重新初始化随机引擎
每次调用rollDice都重新创建std::random_device和std::mt19937,会导致随机数生成的稳定性变差——在某些环境下,甚至可能生成重复的序列。我们应该把随机引擎作为类的成员变量,保证序列的连续性。
修复后的完整代码
#include <iostream> #include <random> #include <string> class Dice { public: virtual void rollDice() = 0; }; class Player : public Dice { public: Player(){ // 初始化随机引擎 std::random_device rd; eng = std::mt19937(rd()); }; Player(int id, std::string name ,int score = 0) : pId(id), pName(name) , pScore(score) { // 初始化随机引擎 std::random_device rd; eng = std::mt19937(rd()); }; void rollDice() override; int displayScore() { return pScore;} // 顺便修正了原拼写错误desplay→display private: int pId; std::string pName; int pScore; unsigned char playerDiceRolled; std::mt19937 eng; // 将随机引擎作为类成员 }; void Player::rollDice() { std::uniform_int_distribution<> distr(1, 6); // 只生成一次随机数,复用这个值 unsigned char rolledValue = distr(eng); this->playerDiceRolled = rolledValue; std::cout << "player rolled:" << static_cast<int>(rolledValue) << "\n"; this->pScore += rolledValue; // 正确的累加运算符 } int main() { Player A(1, "Player"); A.rollDice(); A.rollDice(); std::cout << A.displayScore(); return 0; }
内容的提问来源于stack exchange,提问作者Aris
相关产品推荐
相关产品推荐

