C++开发问题:University类中Student列表按学号排序失败如何解决
问题根因
排序失败的核心原因有两个:
std::list是双向迭代器容器,不支持随机访问,无法使用全局的std::sort函数,必须调用std::list自带的sort()成员方法- 注释的比较函数存在类名拼写错误、普通成员函数无法直接作为比较谓词的问题
修复步骤
1. 修复students类的比较逻辑
两种方案选一种即可,推荐第一种重载小于运算符的方案,更符合C++语义:
方案A:重载小于运算符
修改students.h的public部分,取消注释并修正代码:
class students { // 原有私有成员不变 public: // 修正原代码的拼写错误:estudantes改为students、matricula改为number,同时加const保证安全 friend bool operator<(const students& left, const students& right) { return left.number < right.number; }; // 其他原有public成员保持不变 };
方案B:实现静态比较函数
如果不想重载运算符,可以在students类中定义静态比较函数:
// students.h的public部分添加声明 static bool compare(const students& a, const students& b); // students.cpp中添加实现 bool students::compare(const students& a, const students& b) { return a.number < b.number; }
2. 实现university类的sortstudents方法
修改university.h,取消sortstudents方法的注释:
void sortstudents();
修改university.cpp的sortstudents实现:
void university::sortstudents() { // 如果用了方案A重载<运算符,直接调用无参的list::sort即可 lstudents.sort(); // 如果用了方案B的静态比较函数,就写成 lstudents.sort(students::compare); }
3. 修复现有代码的逻辑bug
- 菜单switch语句的case3缺失break,会直接触发case4退出逻辑,修正后代码:
case 3: this->sortstudents(); cout << "学生列表已按学号排序完成" << endl; break; // 必须加break中断switch case 4: out = false; break; - 注册学生的循环中
resp变量从未被赋值,会无限循环插入学生,修正输入逻辑:// 把原来的 cin >> out; 替换为下面的代码 cin >> resp; cin.ignore();
额外优化建议
- 不要在头文件中写
using namespace std;,会污染全局命名空间,建议在cpp文件中使用或者直接加std::前缀 - students类的get方法都加const修饰,保证const对象也能调用,比如
int getnumber() const; - 遍历用的迭代器建议在循环内局部定义,不要作为类成员,避免重入、多线程场景下的异常问题
内容的提问来源于stack exchange,提问作者RS1982
相关产品推荐
相关产品推荐

