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
相关产品推荐
相关产品推荐

