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

将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:57:03