C++骰子类单元测试失败排查:未调用roll()引发值异常
问题原因与解决方案
嘿,我完全懂你碰到的这个坑——这是C++里非常常见的未初始化成员变量问题!
为什么会出现垃圾值11860256?
你的Die类里用来存储骰子结果的成员变量(比如int value;),在创建Die对象时并没有被初始化。C++不会自动给类的成员变量赋默认值,它会保留这块内存地址之前遗留的随机数据——也就是你看到的那个奇怪的数字11860256,这就是所谓的“垃圾值”。
只有当你调用roll()方法时,这个成员变量才会被赋值为1-6之间的随机数;如果直接调用rolled_value(),你拿到的就是内存里的原始垃圾数据,自然会导致单元测试失败。
三种解决办法,按需选择:
方案1:构造函数里自动执行roll()
最彻底的方式是让Die对象一创建就拥有合法的骰子值,在Die类的构造函数里直接调用roll():// die.h class Die { private: int value; public: // 构造函数初始化时直接roll Die() { roll(); } void roll(); int rolled_value() const; };这样不管是主程序还是单元测试,创建
Die对象后直接调用rolled_value()都会得到1-6之间的合法值,再也不会出现垃圾值。方案2:修改单元测试,先roll再断言
如果你不想修改Die类的逻辑,那必须保证单元测试里先调用roll(),再去验证结果:// 单元测试用例示例 TEST(DieTest, ValidRollRange) { Die die; die.roll(); // 关键!必须先执行roll赋值 int result = die.rolled_value(); ASSERT_TRUE(result >= 1 && result <= 6); }这个方案适合你想保留“对象创建后未roll时无合法值”的逻辑场景,但要记得所有使用
rolled_value()的地方都必须先调用roll()。方案3:给成员变量设置默认合法值
如果你不想在构造函数里调用roll(),也可以直接给成员变量赋一个合法的默认值(比如1):// die.h class Die { private: int value = 1; // 直接初始化默认值为合法骰子数 public: void roll(); int rolled_value() const; };这种方式避免了垃圾值,但缺点是初始值是固定的,不是随机的,是否符合你的业务逻辑需要自己判断。
内容的提问来源于stack exchange,提问作者Erin
相关产品推荐
相关产品推荐

