Как отсортировать объект абстрактного класса - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть базовый абстрактный класс Shapes и 3 производных класса от Circle Square и Rectangle.После расчета площадей всех форм я должен их отсортировать.У меня возникают трудности с использованием 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 голосов
/ 08 февраля 2019

Насколько я понял, похоже, проблема связана с sort(ShapeArray, ShapeArray + MAX, sortAsc);.

Если ваша переменная Shapeindex меньше значения MAX, то доступ к элементам с индекса Shapeindex + 1 доMAX имеет неопределенное поведение, которое может привести к ошибке сегментации.

Вместо этого вы должны сделать следующее:

sort(ShapeArray, ShapeArray + Shapeindex, sortAsc);
0 голосов
/ 08 февраля 2019

(после последнего обновления): вы создаете 10 ShapeTwoD объектов, но сортируете 100 (MAX) указателей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...