You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 04:11:09