包含其他类vector的类无法修改内部值的问题排查
问题根源与修复方案
问题原因
你判断的完全正确——问题核心就是操作了对象拷贝而非原对象,具体出在两个关键位置:
intClassClass::getIC函数返回的是intClass的值拷贝:调用icc.getIC(1).modifyVec(3, 0)时,程序会先从ics容器里拷贝出一个临时intClass对象,你修改的是这个临时对象,修改完成后临时对象立即销毁,容器内的原对象完全没被改动。intClassClass::printVec的循环采用值遍历:for (intClass i : ics)会每次拷贝一个intClass对象,虽然这里只是打印不影响结果,但会产生不必要的性能开销。
修复代码
只需要修改intClassClass的两个成员函数,让它们返回/使用引用即可:
class intClassClass { private: vector<intClass> ics; public: intClassClass(vector<intClass> icVec) { ics = icVec; } // 返回容器内对象的引用,而非值拷贝 intClass& getIC(int index) { return ics[index]; } // 使用const引用遍历,避免不必要的对象拷贝 void printVec() { for (const intClass& i : ics) { i.printVec(); } cout << '\n'; } };
额外优化建议
- 构造函数可以改用初始化列表+移动语义,减少拷贝开销:
intClassClass(vector<intClass> icVec) : ics(std::move(icVec)) {}
- 可以添加一个只读版本的
getIC函数,支持在const对象上获取只读引用:
const intClass& getIC(int index) const { return ics[index]; }
修改后运行你的main函数,输出会符合预期:
1 3 4 5 21 2 4 modified vec 1 3 4 5 21 3 4 3
内容的提问来源于stack exchange,提问作者scutoid
相关产品推荐
相关产品推荐

