C++使用std::list存储对象时get函数无法返回正确设置值问题
问题原因
代码无法返回已设置的股票名称,核心是范围for循环默认使用值传递遍历元素:
for(Stock obj : Stocks)写法下,循环内的obj是list中存储的Stock对象的临时拷贝副本,并非容器内的原始元素- 调用
setStockName()修改的是临时副本的成员值,循环结束后临时副本直接销毁,list中存储的原始Stock对象的stockName字段始终为空 - 最后输出名称的循环同样是拷贝list内未被修改的空对象,自然无法显示设置的名称
修复方法
遍历需要修改容器元素的场景,在范围for循环中使用引用绑定容器内的原始元素,避免生成临时拷贝;只读遍历场景可加const限定,兼顾性能和const正确性。
修正后的主函数循环代码
设置股票名称的循环修改为引用遍历:
//Set the name of each stock for(Stock& obj : Stocks) { std::string stockName; std::cin >> stockName; obj.setStockName(stockName); }
输出股票名称的循环使用const引用遍历:
//Get the name of each Stock for (const Stock& obj : Stocks) { std::cout << obj.getStockName() << " , "; }
可选的规范优化
getStockName()方法不会修改类成员,建议补充const限定,符合C++ const正确性规范:
- 头文件中修改方法声明:
std::string getStockName() const;
- cpp实现文件中同步修改方法定义:
std::string Stock::getStockName() const { return this->stockName; }
内容的提问来源于stack exchange,提问作者Kristian Kirkov
相关产品推荐
相关产品推荐

