如何对抽象类对象进行排序
Posted
技术标签:
【中文标题】如何对抽象类对象进行排序【英文标题】:How to sort an abstract class object 【发布时间】:2019-02-08 14:13:42 【问题描述】:我有一个 Shapes 的基本抽象类,以及 Circle Square 和 Rectangle 的 3 个派生类。在计算出所有形状的面积后,我需要对它们进行排序。我在库中使用 std::sort 进行排序时遇到困难,因为我的 Shapes 是一个抽象类。 希望有人能指出我做错的正确方向。
我尝试过运算符重载,声明我自己的比较器函数。
#define MAX 100
class ShapeTwoD
protected:
string name;
double area;
public:
ShapeTwoD()
ShapeTwoD(string name, double area);
virtual ~ShapeTwoD()
string getName();
virtual string toString();
virtual double getArea() = 0;
virtual void setArea(double area) = 0;
virtual double computeArea() = 0;
;
bool sortAsc(ShapeTwoD *s1, ShapeTwoD *s2)
return s1->getArea() < s2->getArea();
class Square: public ShapeTwoD
public:
Square()
Square(string name, double area);
~Square()
virtual double getArea();
virtual void setArea(double area);
virtual string toString();
virtual double computeArea();
;
int main()
ShapeTwoD * ShapeArray[MAX];
string name;
double area;
int Shapeindex;
for( int i = 0; i < 10; i++)
cin << name;
cin << area;
if (name == "Square" || name == "square")
ShapeArray[Shapeindex] = new Square(name, area);
Shapeindex++;
sort(ShapeArray, ShapeArray + MAX, sortAsc);
上述代码的实际结果:读取访问冲突错误,我假设它是因为我试图从我的抽象类而不是派生类中读取该区域。
【问题讨论】:
请edit您的问题与minimal reproducible example 或SSCCE (Short, Self Contained, Correct Example)ShapeArray
是如何填充的?从您当前的示例中可以看出,它包含MAX
数量的未初始化指针。取消引用其中任何一个都会导致未定义的行为。
请同时包含Shape
、Circle
、Square
和Rectangle
的定义。
@NathanOliver 我用更多信息编辑了这个问题。
@KunalPuri 我刚刚编辑了问题以显示更多信息
【参考方案1】:
(最新更新后):您正在创建 10 个 ShapeTwoD
对象,但对 100 个 (MAX
) 指针进行排序。
【讨论】:
很可能这不是 OP 实际拥有的,他们只是解释它。我们真的应该在回答之前等待minimal reproducible example。【参考方案2】:据我了解,好像是sort(ShapeArray, ShapeArray + MAX, sortAsc);
相关的问题。
如果您的Shapeindex
变量小于MAX
值,则从索引Shapeindex + 1
到MAX
访问元素会出现未定义行为,这可能会导致分段错误。
相反,您应该这样做:
sort(ShapeArray, ShapeArray + Shapeindex, sortAsc);
【讨论】:
我在尝试计算面积时遇到了这个问题,我将 MAX 更改为 Shapeindex,但是当错误出现时我以某种方式错过了这个问题。谢谢! 如果你使用向量而不是数组就不会出现这个问题,向量更容易更强大,使用它们。以上是关于如何对抽象类对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章