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

C++程序调用函数时出现Undefined reference及退出状态错误

问题解决与代码修正

一、编译/链接错误的原因与修复

你遇到的undefined reference to 'makeassessH()'和链接错误,核心原因是函数声明与定义的拼写不一致:

  • 声明的函数是makeassessH()
  • 实际定义的函数写成了makeassesH()(少了一个字母s)

直接把函数定义的名字改成makeassessH()就能解决这个链接错误。

二、递归逻辑的实现(达到权重100停止)

要实现每个阶段的评估函数递归调用,直到总权重达到100,需要给每个makeassessX函数添加参数跟踪当前累计权重,具体步骤:

  • 修改函数声明,添加累计权重参数(默认值设为0,方便首次调用)
  • 函数内部累加当前评估的权重,判断是否达到100:未达到则递归调用自身,传入更新后的权重;达到则停止递归
  • 修复cin.ignore()重复调用问题,避免吞掉输入内容

三、完整修正后的代码

// 相关头文件
#include <iostream>
#include <fstream>
#include <string>

using namespace std;

int option = 0; // 初始化option,避免随机值进入循环

void newStudent();
void makeassessH(int totalWeight = 0); // 添加累计权重参数
void makeassessI(int totalWeight = 0);
void makeassessC(int totalWeight = 0);

class Student {
public:
    int stuNum;
    string stuName;
    int startDate;
    int endDate;
    string progofStudy;
    char level;
};

class Assessment{
public:
    string title;
    int weight;
    double grade;
    string deadline;
};

int main()
{
    // 选项页面
    while (option != 5) {
        cout << "\n请选择操作选项\n"
             << "1. 添加新学生\n"
             << "2. 学生登录\n"
             << "3. 教职工登录\n"
             << "4. 管理员查看\n"
             << "5. 退出\n"
             << "输入选项: ";

        cin >> option;

        if (option == 1) {
            newStudent();
        } else if (option == 5) {
            return 0;
        }
    }
}

void newStudent() {
    Student stu;
    cout << "请输入你的学号: ";
    cin >> stu.stuNum;

    cout << "请输入你的姓名: ";
    cin.ignore(); // 仅在读取字符串前忽略一次换行符
    getline(cin, stu.stuName);

    cout << "请输入入学日期: ";
    cin >> stu.startDate;

    cout << "请输入毕业日期: ";
    cin >> stu.endDate;

    cout << "请输入你的专业: ";
    cin.ignore();
    getline(cin, stu.progofStudy);

    cout << "请输入你的学习阶段(H/I/C): ";
    cin >> stu.level;
    stu.level = toupper(stu.level); // 统一转为大写,简化判断

    if(stu.level == 'H'){
        makeassessH();
        makeassessI();
        makeassessC();
    } else if (stu.level == 'I'){
        makeassessI();
        makeassessC();
    } else if(stu.level == 'C') {
        makeassessC();
    } else {
        cout << "无效的学习阶段输入!" << endl;
    }
}

void makeassessH(int totalWeight) {
    if (totalWeight >= 100) {
        cout << "H阶段评估权重已达100,进入下一阶段" << endl;
        return;
    }

    Assessment assessmentH;

    cout << "\n=== H阶段评估信息 ===" << endl;
    cout << "评估标题: ";
    cin.ignore();
    getline(cin, assessmentH.title);

    cout << "评估权重(当前累计: " << totalWeight << "): ";
    cin >> assessmentH.weight;
    // 防止输入超过剩余权重的数值
    if (totalWeight + assessmentH.weight > 100) {
        cout << "输入的权重超过剩余额度,自动调整为" << 100 - totalWeight << endl;
        assessmentH.weight = 100 - totalWeight;
    }

    cout << "评估成绩: ";
    cin >> assessmentH.grade;

    cout << "截止日期: ";
    cin >> assessmentH.deadline;

    // 递归调用,更新累计权重
    makeassessH(totalWeight + assessmentH.weight);
}

void makeassessI(int totalWeight) {
    if (totalWeight >= 100) {
        cout << "I阶段评估权重已达100,进入下一阶段" << endl;
        return;
    }

    Assessment assessmentI;

    cout << "\n=== I阶段评估信息 ===" << endl;
    cout << "评估标题: ";
    cin.ignore();
    getline(cin, assessmentI.title);

    cout << "评估权重(当前累计: " << totalWeight << "): ";
    cin >> assessmentI.weight;
    if (totalWeight + assessmentI.weight > 100) {
        cout << "输入的权重超过剩余额度,自动调整为" << 100 - totalWeight << endl;
        assessmentI.weight = 100 - totalWeight;
    }

    cout << "评估成绩: ";
    cin >> assessmentI.grade;

    cout << "截止日期: ";
    cin >> assessmentI.deadline;

    makeassessI(totalWeight + assessmentI.weight);
}

void makeassessC(int totalWeight) {
    if (totalWeight >= 100) {
        cout << "C阶段评估权重已达100,流程结束" << endl;
        return;
    }

    Assessment assessmentC;

    cout << "\n=== C阶段评估信息 ===" << endl;
    cout << "评估标题: ";
    cin.ignore();
    getline(cin, assessmentC.title);

    cout << "评估权重(当前累计: " << totalWeight << "): ";
    cin >> assessmentC.weight;
    if (totalWeight + assessmentC.weight > 100) {
        cout << "输入的权重超过剩余额度,自动调整为" << 100 - totalWeight << endl;
        assessmentC.weight = 100 - totalWeight;
    }

    cout << "评估成绩: ";
    cin >> assessmentC.grade;

    cout << "截止日期: ";
    cin >> assessmentC.deadline;

    makeassessC(totalWeight + assessmentC.weight);
}

四、其他细节修复

  • 初始化全局变量option,避免程序启动时因未定义值进入异常循环
  • 统一将用户输入的学习阶段转为大写,简化条件判断逻辑
  • 输入权重时增加校验,防止累计权重超过100
  • 修复makeassessC中错误累加grade的问题,改为累加weight
  • 优化输入提示的中文表述,更符合使用习惯

内容的提问来源于stack exchange,提问作者LGGawd

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:03:36