如何对抽象类对象进行排序

时间:2019-02-08 14:13:42

标签: c++ sorting inheritance polymorphism

我有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);
}

以上代码的实际结果:读取访问冲突错误,我假设是因为我试图从抽象类而不是派生类中读取区域。

2 个答案:

答案 0 :(得分:3)

(在最新更新之后):您正在创建10个ShapeTwoD对象,但对100个(MAX)指针进行了排序。

答案 1 :(得分:1)

据我了解,这似乎是与sort(ShapeArray, ShapeArray + MAX, sortAsc);相关的问题。

如果您的Shapeindex变量小于MAX值,则从索引Shapeindex + 1MAX的元素访问均具有未定义的行为,这可能导致分段错误。

相反,您应该这样做:

sort(ShapeArray, ShapeArray + Shapeindex, sortAsc);