类中枚举调用自身成员函数后未变更的技术问题求助
排查类枚举值修改未生效的问题
从你给出的代码对比来看,直接修改level->state能正常生效,但通过do()函数修改就没效果,核心问题肯定出在do()函数的实现上,下面是几个最可能的原因和排查方案:
1. 局部变量遮蔽了成员变量
这是最常见的情况——你在do()函数里定义了一个和成员变量state同名的局部变量,导致修改的只是局部变量,根本没碰到位成员变量。
比如错误的do()实现可能是这样的:
void level_1::do() { // 这里定义了局部的state,和类成员变量无关 STATE state = STATE_INITIALIZE; }
这种情况下,你修改的只是函数内部的临时变量,类实例的state完全没变化,所以循环里一直显示初始值1。
正确的写法应该是直接修改成员变量,要是怕混淆可以用this->明确指定:
void level_1::do() { // 直接修改类成员变量 this->state = STATE_INITIALIZE; // 或者如果没有同名局部变量,直接写 state = STATE_INITIALIZE; 也可以 }
2. do()函数里的修改被后续逻辑覆盖了
有可能你在do()里确实修改了state,但后面又有代码把它改回了初始值。比如:
void level_1::do() { state = STATE_INITIALIZE; // 后面的逻辑又把state改回了原来的枚举值(比如对应1的那个) some_other_function_that_resets_state(); }
这种情况你可以在do()函数里加调试输出,看看修改前后state的值:
void level_1::do() { cout << "Before modify: " << state << endl; state = STATE_INITIALIZE; cout << "After modify: " << state << endl; // 看看后面有没有其他修改state的代码 }
运行后看控制台输出,就能知道是不是被覆盖了。
3. 成员变量state的权限或属性问题
虽然你直接修改能生效,但还是要确认下level_1类中state的定义:
- 它是不是被声明为
const?如果是const STATE state;,直接修改应该会编译报错,但如果用了const_cast之类的操作,可能导致修改不生效。 - 它是不是私有成员?不过你能直接修改
level->state,说明它至少是保护或公有的,这个可能性较低,但也可以检查下类的定义。
快速排查步骤
- 打开
level_1类的do()函数实现,先找有没有和state同名的局部变量。 - 在
do()里添加调试输出,跟踪state的修改过程。 - 确认
state成员变量的声明(是否非const、权限是否正确)。
按照这个思路排查,应该很快就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者Asia Dep
相关产品推荐
相关产品推荐

