C++中如何更新存储在另一类数组内的对象成员属性?
C++类对象成员更新问题解决方案
问题1:正确实现changeStudentScores函数
你原有逻辑的核心问题是新建的临时Student对象和Algorithms类中存储的学生数组完全无关,修改临时对象不会影响已存储的学生数据,修改方案如下:
- 给
changeStudentScores新增Algorithms引用参数,传入要操作的课程实例 - 借助
Algorithms类的查询方法拿到对应ID的原学生对象指针 - 校验学生存在后,调用其
setQuizScores方法传入分数数组
// 全局函数实现,需要提前声明Algorithms类和getStudentInfo方法 void changeStudentScores(int ID, int* quizscores, Algorithms &algorithms ){ Student* target = algorithms.getStudentInfo(ID); if(target != nullptr){ target->setQuizScores(quizscores); } } // main函数中调用时需要传入ECE101实例 changeStudentScores(ID, quiz_grades, ECE101);
问题2:修改getStudentInfo的返回类型
按要求修改为返回Student类型指针即可,匹配ID返回对应对象地址,匹配失败返回空指针,同时删除多余的Algorithms&参数(成员函数可直接访问自身属性):
首先修改Algorithms类的public声明:
class Algorithms{ public: // 原有方法保留,修改getStudentInfo声明如下 Student* getStudentInfo(int ID_given); };
方法实现:
Student* Algorithms :: getStudentInfo(int ID_given){ // 仅遍历已添加的num个学生,无需遍历全部MAX容量 for(int i = 0; i<num; i++){ if(ID_given == students[i].getID()){ // 打印逻辑可保留也可移到showStudent函数中 cout << "Student Name & Surname : " << students[i].getName() << " " << students[i].getSurName()<<"\n"; cout << "Quiz results :"; const int* scores = students[i].getQuizScores(); for(int j=0;j<4;j++){ cout << " " << scores[j]; } cout << "\n"; return &students[i]; } } cout << "未找到对应ID的学生\n"; return nullptr; }
问题3:跨类存储结构的对象成员更新通用逻辑
- 存储数据的类(如
Algorithms)需要对外提供公开的查询接口,支持根据唯一标识(如学生ID)返回存储的原对象的可修改引用/指针,禁止直接对外暴露内部存储结构(如students数组)。 - 修改操作的执行方(如全局函数
changeStudentScores)需要持有存储类实例的引用/指针,不能凭空创建目标对象的临时副本。 - 先通过查询接口定位到目标对象,校验对象存在后,调用目标类(如
Student)提供的公开setter方法修改对应成员,不要直接操作目标类的私有属性。 - 如果修改有合法性校验(如分数不能为负),可以放在setter方法或者存储类的修改接口里实现。
额外修复的已知bug
- Student构造函数的数组越界问题:原有
quiz_scores[4] = {0}访问了数组下标4,超出0-3的合法范围,修改为:
Student() { ID = 0; name = "" ; surname = ""; for(int i=0;i<4;i++){ quiz_scores[i] = 0; } }
- main函数的do-while缺少循环条件,建议添加退出选项,每次操作后重新让用户选择操作。
内容的提问来源于stack exchange,提问作者Yalçın Cenik
相关产品推荐
相关产品推荐

