嵌套std::vector的类成员访问异常:设值后读取随机数
问题分析:修改嵌套vector成员后读取无效值的原因及解决办法
嘿,我一眼就看出问题出在哪了——这和返回值优化(RVO)半毛钱关系都没有,核心是你Company类里的employees()函数返回的是vector的副本,不是引用!这就导致你所有的修改操作都打在了“空气”上,原容器里的对象根本没被改动。
咱们一步步拆解:
首先看Company::employees()的实现:
std::vector<Employee> Company::employees() { return m_employees; }
每次调用这个函数,都会创建一个m_employees的全新副本返回。再看你出问题的调用代码:
m_companies.at(m_companyIndex).employees().at(m_emplIndex).set_id(empl_id);
这行代码的执行流程是:
- 从
m_companies里拿到真正的Company对象 - 调用
employees()得到一个临时的vector副本 - 修改这个临时副本里的Employee的id
- 这行代码执行完毕,临时副本就被销毁了,原
Company里的m_employees一点变化都没有
然后你下一行读取的时候:
int idRet = m_companies.at(m_companyIndex).employees().at(m_emplIndex).id();
又调用了一次employees(),得到另一个全新的vector副本——里面的Employee还是初始未初始化的状态,所以读到的是随机值,完全合理。
之前你单独实例化Employee或Company时正常,是因为你直接操作的是原对象,没有通过返回副本的函数间接操作,所以没触发这个问题。
解决办法
把employees()改成返回引用,这样就能直接操作Company内部的原容器:
首先在Company的头文件里修改声明:
class Company { public: std::vector<Employee> m_employees; void addEmployee(const Employee employee); // 返回非const引用,允许修改容器内的对象 std::vector<Employee>& employees(); // 再加一个const重载,供const对象调用(只读) const std::vector<Employee>& employees() const; };
然后在Company.cpp里实现:
std::vector<Employee>& Company::employees() { return m_employees; } const std::vector<Employee>& Company::employees() const { return m_employees; }
这样修改后,你的调用代码就会直接作用在原m_employees容器上,修改会被保留,后续读取自然能得到正确的5。
内容的提问来源于stack exchange,提问作者Loke
相关产品推荐
相关产品推荐

