无法保存User对象关联的Exercise向量数据的问题排查及解决咨询
看起来你遇到的问题是调用saveEverything函数时,没法把User对象里的Exercise向量数据写入文件。我来帮你捋捋可能的原因和对应的解决思路:
一、参数传递方式导致的拷贝丢失
你的saveEverything函数参数是std::vector<User> users,这是值传递——调用函数时会把整个用户向量复制一份到函数内部。如果User类的拷贝构造函数没正确复制UserExercises这个成员,那函数里的副本用户对象,其Exercise向量就是空的,自然写不出数据。
解决办法有两个:
- 检查你的User拷贝构造函数,确保显式复制了
UserExercises。正确的拷贝构造应该是这样的:User(const User& other) : UserFirstName(other.UserFirstName), UserLastname(other.UserLastname), UserAge(other.UserAge), UserWeight(other.UserWeight), UserExercises(other.UserExercises) {} // 这一行必须有,负责复制Exercise向量 - 更高效的方式是把函数参数改成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

