C++中通过STL vector修改类成员变量无效,如何解决?
问题:STL Vector中修改类成员变量无效
我尝试在C++中通过STL vector设置类的成员变量,但并未达到预期效果——变量没有发生变化,仍与修改前一致。
代码示例
#include <iostream> #include <vector> using namespace std; class Test { private: std::string name; public: Test(); Test(std::string p_name); std::string getName(); void setName(std::string p_name); }; Test::Test() { name = ""; } Test::Test(std::string p_name) : name(p_name) {} std::string Test::getName() { return name; } void Test::setName(std::string p_name) { name = p_name; } int main() { // Initializing vector with values vector<Test> tests; for (size_t i = 0; i < 10; i++) { tests.push_back(Test()); } for (Test test : tests) { cout << test.getName() << endl; test.setName("a"); } for (Test test : tests) { cout << test.getName() << endl; } return 0; }
运行结果
> ./main >
问题原因
核心问题在于范围for循环的变量声明方式:for (Test test : tests)会将vector中的每个元素拷贝到局部变量test中,你后续调用setName修改的只是这个临时拷贝对象,而非vector容器中存储的原对象。当循环结束后,临时对象被销毁,原vector的元素自然不会有任何变化。
修复方案
有两种常见的修复方式:
1. 使用引用遍历(推荐)
将循环变量改为非const引用,这样test会直接指向vector中的原元素,修改操作会直接作用于原对象:
int main() { vector<Test> tests; for (size_t i = 0; i < 10; i++) { tests.push_back(Test()); } // 使用非const引用遍历,直接操作原对象 for (Test& test : tests) { cout << test.getName() << endl; test.setName("a"); } for (const Test& test : tests) { // 只读场景用const引用,更高效 cout << test.getName() << endl; } return 0; }
2. 使用迭代器遍历
如果习惯传统迭代器写法,也可以通过迭代器直接访问并修改原元素:
int main() { vector<Test> tests; for (size_t i = 0; i < 10; i++) { tests.push_back(Test()); } // 迭代器遍历修改原对象 for (auto it = tests.begin(); it != tests.end(); ++it) { cout << it->getName() << endl; it->setName("a"); } for (const auto& test : tests) { cout << test.getName() << endl; } return 0; }
修改后预期结果
第一次循环输出10个空行,第二次循环会输出10行a。
内容的提问来源于stack exchange,提问作者World
相关产品推荐
相关产品推荐

