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

C++类实例化时传入参数被默认参数覆盖的问题排查

问题根因

你遇到的现象核心是std::vector初始化用法错误,和构造函数传参逻辑无关:
std::vector<yo> yos(20); 会直接调用yo的默认构造函数生成20个实例,这20个实例的speed都是默认值1。你后续调用spawnYos只是在这个已有20个元素的vector末尾追加了1个speed为5的实例,所以遍历输出时前20次都是1,你误以为传入的参数被覆盖了,实际上speed为5的实例排在第21位。

修复方案
  • 如果你不需要预先生成20个默认实例,只是想预留内存空间避免后续扩容:
    把vector初始化代码修改为:
std::vector<yo> yos;
yos.reserve(20);

reserve只会预分配内存不会实际构造对象,你push_back的实例就是vector里的第一个元素,调用move()就会正常输出5。

  • 如果你确实需要初始化20个带自定义参数的实例:
    可以循环调用emplace_back传入你的参数,示例:
std::vector<yo> yos;
yos.reserve(20);
for(int i=0;i<20;i++){
    yos.emplace_back(340,5);
}
额外注意事项

你当前的for循环遍历erase逻辑存在bug:当你erase掉下标为i的元素后,后续元素会往前移动一位,下一次循环i自增就会跳过新的下标为i的元素,建议修改为迭代器遍历的写法:

for(auto it = yos.begin(); it != yos.end();){
    it->move();
    if (it->getx() < 0 || it->getx() > 1290) {
        it = yos.erase(it);
    } else {
        ++it;
    }
}

内容的提问来源于stack exchange,提问作者Kenbo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:57:03