C++ vector存储子类对象时调用父类重载运算符比较排序问题
解决方案
你既不需要重载[]运算符,也不需要修改compare()的参数类型,现有代码的核心问题是Vecsort函数的设计逻辑错误,没有调用内部vector的元素做比较,修正方案如下:
1. 核心问题说明
你当前写的Vecsort接收两个外部传入的a类对象作为参数,全程没有用到类c内部存储的vec成员,自然只能比较传入的固定参数,和你存在vector里的子类对象完全无关。
同时因为b是a的公有子类,const b&类型可以隐式转换为const a&,完全适配compare函数的入参要求,不需要修改compare的定义。
2. 修正代码实现
你可以直接用STL提供的std::sort完成排序,不需要自己手写排序逻辑,代码更稳定:
#include <algorithm> // 类c内部的Vecsort实现,不需要额外入参 void c::Vecsort() { // 方案1:直接用你重载的operator<做默认排序 std::sort(vec.begin(), vec.end()); // 方案2:显式调用你自定义的compare函数排序 // std::sort(vec.begin(), vec.end(), compare); }
如果你一定要自己实现排序逻辑,参考冒泡排序写法:
void c::Vecsort() { int len = vec.size(); for (int i = 0; i < len - 1; i++) { for (int j = 0; j < len - i - 1; j++) { // 直接传入vector的两个元素到compare即可 if (compare(vec[j], vec[j+1])) { swap(vec[j], vec[j+1]); } } } }
3. 其他需要修正的语法/逻辑问题
- 类
a的compare函数存在笔误:变量名Al.name应为A1.name,访问的成员是names不是name,且函数外层缺了大括号 setVec函数存在对象切片风险:你当前入参是const a&,但vector存储的是b类型,直接push_back(A)会切割掉子类b的独有成员,如果不需要保留子类独有属性,可以把vec改为vector<a>类型,否则建议改用智能指针存储vector<std::unique_ptr<a>>避免切片- 所有类定义结束后需要加分号
;,成员函数的实现末尾分号位置错误
内容的提问来源于stack exchange,提问作者Colton F
相关产品推荐
相关产品推荐

