我有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);
}
以上代码的实际结果:读取访问冲突错误,我假设是因为我试图从抽象类而不是派生类中读取区域。
答案 0 :(得分:3)
(在最新更新之后):您正在创建10个ShapeTwoD
对象,但对100个(MAX
)指针进行了排序。
答案 1 :(得分:1)
据我了解,这似乎是与sort(ShapeArray, ShapeArray + MAX, sortAsc);
相关的问题。
如果您的Shapeindex
变量小于MAX
值,则从索引Shapeindex + 1
到MAX
的元素访问均具有未定义的行为,这可能导致分段错误。
相反,您应该这样做:
sort(ShapeArray, ShapeArray + Shapeindex, sortAsc);