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

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 数量的未初始化指针。取消引用其中任何一个都会导致未定义的行为。 请同时包含ShapeCircleSquareRectangle的定义。 @NathanOliver 我用更多信息编辑了这个问题。 @KunalPuri 我刚刚编辑了问题以显示更多信息 【参考方案1】:

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

【讨论】:

很可能这不是 OP 实际拥有的,他们只是解释它。我们真的应该在回答之前等待minimal reproducible example。【参考方案2】:

据我了解,好像是sort(ShapeArray, ShapeArray + MAX, sortAsc);相关的问题。

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

相反,您应该这样做:

sort(ShapeArray, ShapeArray + Shapeindex, sortAsc);

【讨论】:

我在尝试计算面积时遇到了这个问题,我将 MAX 更改为 Shapeindex,但是当错误出现时我以某种方式错过了这个问题。谢谢! 如果你使用向量而不是数组就不会出现这个问题,向量更容易更强大,使用它们。

以上是关于如何对抽象类对象进行排序的主要内容,如果未能解决你的问题,请参考以下文章

面向对象 抽象类和接口

抽象类

抽象类

如何对抽象类进行单元测试

TypeScript,面向对象,类、构造函数、继承、抽象类、接口和封装

JAVA 抽象类