将Enemy对象存入vector后调用函数显示出现异常数值问题求助
问题排查与解决思路
1. 先确认构造函数是否正确初始化成员变量
这是最常见的异常数值根源:构造函数没把参数赋值给类成员变量,导致成员是随机垃圾值。
错误示例:
// 构造函数内没给成员赋值,或者错误地给局部参数赋值 Enemy::Enemy(int hp, int dmg) { hp = hp; // 这是局部参数自己赋值给自己,和类成员无关 }
正确写法(二选一即可):
// 推荐:用初始化列表直接初始化成员 Enemy::Enemy(int hp, int dmg) : m_hp(hp), m_dmg(dmg) {} // 或者函数体内明确给成员赋值 Enemy::Enemy(int hp, int dmg) { m_hp = hp; m_dmg = dmg; }
2. 检查getter方法的实现
如果getter返回的不是类成员变量,而是未初始化的局部变量,也会输出异常值:
错误示例:
int Enemy::getHp() { int hp; // 返回未初始化的局部变量 return hp; }
正确写法:
// 加const更规范,确保调用getter时不会修改对象 int Enemy::getHp() const { return m_hp; }
3. 检查vector的存储与遍历逻辑
- 确认存入vector的是已正确构造的对象,比如不要误存临时对象的无效引用(如果存对象而非指针,编译器默认拷贝构造会逐成员复制,只要构造正常就没问题)
- 遍历vector时注意不要越界:
// 错误示例:用了<=导致访问超出vector范围的元素 for (int i = 0; i <= enemies.size(); i++) { cout << enemies[i].getHp() << endl; }
正确遍历:
for (int i = 0; i < enemies.size(); i++) { cout << enemies[i].getHp() << endl; } // 或者用范围for更安全 for (const auto& enemy : enemies) { cout << enemy.getHp() << endl; }
关键结论:构造函数与getter/setter完全可以共存
你疑惑的“无法同时使用带参数构造函数与getter/setter”是错误的,这两者是类设计中完全兼容的部分,问题大概率出在上述某一步的实现错误上。
建议先单独打印构造完成但未存入vector的Enemy对象数值:如果此时就异常,直接排查构造函数;如果此时正常,再检查vector的存储或遍历逻辑。
内容的提问来源于stack exchange,提问作者Luka Pavlov
相关产品推荐
相关产品推荐

