C++指针vector传入辅助函数修改指向对象字段未生效问题求解
问题根因说明
首先你的猜测不成立:std::vector::push_back 存储指针时,保存的是指针的值拷贝,不是局部变量result的引用。if块结束后result局部变量销毁,不会影响vector中已经存储的指针值,只要resultsArg里的指针指向的对象本身没有提前释放,存储的指针就是有效的。
你遇到的未修改问题,大概率是以下几种原因:
- 辅助函数从未被调用:如果
FuncIsTrue()在10次循环中始终返回true,else分支永远不会触发,helperFunction全程没有执行,自然对象字段不会被修改。 - 循环末尾元素未被处理:如果最后几次循环
FuncIsTrue()都返回true,循环结束后storage里残留的元素不会触发helperFunction调用,对应的对象不会被修改。 Result::setX实现错误:如果setter方法的参数名和类成员变量名重名,没有加this指针的话会出现赋值不生效的问题,示例错误写法如下:
// 错误实现:赋值给了参数x而非类成员变量 void Result::setX(int x) { x = x; } // 正确实现 void Result::setX(int x) { this->x = x; }
修复方案
首先补全逻辑,循环结束后额外处理storage中残留的未处理元素:
void Test(std::vector<Result*>& resultsArg){ std::vector<Result*> storage; for(int i = 0; i < 10; i ++) { if(FuncIsTrue()){ auto* result = resultsArg.at(i); storage.push_back(result); } else { helperFunction(storage); storage.clear(); } } // 新增:处理循环结束后还未处理的元素 if (!storage.empty()) { helperFunction(storage); storage.clear(); } }
之后依次排查FuncIsTrue的返回逻辑是否符合预期、setX方法的实现是否正确即可。
内容的提问来源于stack exchange,提问作者AntcDev
相关产品推荐
相关产品推荐

