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

C++中如何更新存储在另一类数组内的对象成员属性?

C++类对象成员更新问题解决方案

问题1:正确实现changeStudentScores函数

你原有逻辑的核心问题是新建的临时Student对象和Algorithms类中存储的学生数组完全无关,修改临时对象不会影响已存储的学生数据,修改方案如下:

  1. 给changeStudentScores新增Algorithms引用参数,传入要操作的课程实例
  2. 借助Algorithms类的查询方法拿到对应ID的原学生对象指针
  3. 校验学生存在后,调用其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

  1. Student构造函数的数组越界问题:原有quiz_scores[4] = {0}访问了数组下标4,超出0-3的合法范围,修改为:
Student()
{
    ID = 0;
    name = "" ;
    surname = "";
    for(int i=0;i<4;i++){
        quiz_scores[i] = 0;
    }
}
  1. main函数的do-while缺少循环条件,建议添加退出选项,每次操作后重新让用户选择操作。

内容的提问来源于stack exchange,提问作者Yalçın Cenik

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 19:36:00