You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

嵌套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);

这行代码的执行流程是:

  1. 从m_companies里拿到真正的Company对象
  2. 调用employees()得到一个临时的vector副本
  3. 修改这个临时副本里的Employee的id
  4. 这行代码执行完毕,临时副本就被销毁了,原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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:27:56