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

无法保存User对象关联的Exercise向量数据的问题排查及解决咨询

无法保存User对象关联的Exercise向量数据的问题排查及解决咨询

看起来你遇到的问题是调用saveEverything函数时,没法把User对象里的Exercise向量数据写入文件。我来帮你捋捋可能的原因和对应的解决思路:

一、参数传递方式导致的拷贝丢失

你的saveEverything函数参数是std::vector<User> users,这是值传递——调用函数时会把整个用户向量复制一份到函数内部。如果User类的拷贝构造函数没正确复制UserExercises这个成员,那函数里的副本用户对象,其Exercise向量就是空的,自然写不出数据。

解决办法有两个:

  1. 检查你的User拷贝构造函数,确保显式复制了UserExercises。正确的拷贝构造应该是这样的:
    User(const User& other) 
        : UserFirstName(other.UserFirstName),
          UserLastname(other.UserLastname),
          UserAge(other.UserAge),
          UserWeight(other.UserWeight),
          UserExercises(other.UserExercises) {} // 这一行必须有,负责复制Exercise向量
    
  2. 更高效的方式是把函数参数改成const引用,彻底避免不必要的拷贝,直接使用原数据:
    void saveEverything(const std::vector<User>& users) { // 这里加const&
        // 函数体逻辑保持不变即可
    }
    

二、Exercise类的拷贝逻辑有问题

如果Exercise类内部有动态分配的资源(比如自定义指针成员),但你没正确实现拷贝构造函数和赋值运算符,那复制出来的Exercise对象会丢失数据,写入文件时自然看不到内容。

解决思路:检查Exercise类的拷贝构造和赋值运算符,确保所有成员变量都被正确复制。如果Exercise没有动态资源,默认的拷贝构造应该能正常工作,但如果有自定义成员,最好显式实现拷贝逻辑。

三、先确认传入的User对象已正确填充Exercise数据

有时候问题根本不在saveEverything函数里,而是调用它之前,User对象的UserExercises本来就是空的。你可以在调用saveEverything前加一段调试代码验证:

// 调用saveEverything前的调试代码
for (const auto& user : users) {
    std::cout << "用户 " << user.getUserFirstName() << " 拥有 " << user.getExercises().size() << " 条训练记录\n";
}

如果输出显示训练记录数量为0,那说明数据在传入函数前就没被正确填充,得去检查填充UserExercises的代码逻辑。

四、优化getExercises方法(非必要但推荐)

你的getExercises方法返回的是向量的值,每次调用都会拷贝整个Exercise向量,既浪费性能也可能引入拷贝问题。可以改成返回const引用:

const std::vector<Exercise>& User::getExercises() const { // 加const&和const修饰符
    return UserExercises;
}

这样在saveEverything里获取训练数据时,直接引用原向量,不会产生额外拷贝,也能避免拷贝带来的潜在问题。

总结一下:优先试试把函数参数改成const引用,这是最可能快速解决问题的方法;然后检查拷贝构造函数是否覆盖了所有成员;最后验证传入的数据是否已经正确填充。

备注:内容来源于stack exchange,提问作者szymusiok

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.23 10:37:42