Проблема с перегрузкой операторов

234
27 апреля 2018, 14:16

Есть родительский класс с перегрузкой оператора +

    class Figure {
public:
    static sf::RenderWindow *windluz;
    static int N;
    static const int MAX;
    sf::Vector2f position, size;
    sf::Color color;
    virtual double square() {};
    virtual void draw() {};
    virtual void move(sf::Vector2f shift) {};
    virtual void scale(double zoom) {};
    Figure(sf::Vector2f position, sf::Vector2f size, sf::Color color);
    friend Figure * operator+(Figure *a, Figure b) {
        a = &b;
        Figure::N++;
        return a;
    }
};

Дочерний класс

class Rectangle : public Figure {
public:
    sf::RectangleShape rectangleShape;
    Rectangle(sf::Vector2f position, sf::Vector2f size, sf::Color color);
    void draw();

    void move(sf::Vector2f shift);
    void scale(double zoom);
    double square();
    double square(double a, double b);
};

В файле main

sf::RenderWindow *Figure::windluz;
int Figure::N = 0;
const int Figure::MAX = 10;
Figure *array[Figure::MAX];

и в функции main

sf::RenderWindow window(sf::VideoMode(1920, 1080), "classes");
Figure::windluz = &window;

Rectangle rectangle(sf::Vector2f(60, 120), sf::Vector2f(60, 80), sf::Color::Black);
array[Figure::N] + rectangle;

при попытке вызвать метод из элемента массива происходит ошибка segmentation fault

for (int i = 0; i < Figure::N; ++i) {
     array[i]->draw(); //segmentation fault
}

подозреваю что проблема в неправильной перегрузке оператора, потому что если записать элемент в массив напрямую то все в порядке

array[Figure::N] = &rectangle;//работает

мне нужно записать элемент в массив именно с помощью "+"

Answer 1

Что у вас с классами? Посмотрите на них: у вас используются указатели в классах, но при этом не видно ни деструкторов ни конструкторов копирования. Тобишь при уничтожение объекта память не будет освобождаться, а при копировании указатель просто задвоится, а не будет скопирована полезная информация.

Следующее: что это вообще за код?

friend Figure * operator+(Figure *a, Figure b) {
    a = &b;
    Figure::N++;
    return a;
}

Вы передаете в функцию Figure b по значению (тоесть копируете объект - а конструктора копирования у вас нет!), а потом берете его адрес, присваиваете указателю a и возвращаете его... Что это за порнография? Для того, чтобы так делать, вы должны были передать b не по значению, а по адресу.

Дальше: что означает

Figure *array[Figure::MAX];

Вы вкурсе, что вы создали массив указателей? Тоесть в каждом элементе array стоит не объект, а указатель на него. Происходит ли инициализация? Думаю, что вы об этом не позаботились. Но окей, давайте сделаем так:

Figure array[Figure::MAX];

Тогда элементы будут объектами, а не указателями на них. Но вот только вы не позаботились о конструкторе по умолчанию. Да и вообще что это за классы у вас такие? Почему методы вместе с переменными в public? Классы не для этого были созданы, чтобы вот так с ними обращаться. Данные нужно скрывать и давать доступ только через соответствующие методы. Об инициализации должны заботится конструкторы, а об освобождении памяти - деструкторы. То что вы делаете (не заботитесь о инициализации, сохранении и правильном использовании данных) как раз и приводит к таким ошибкам.

READ ALSO
Графический векторный редактор

Графический векторный редактор

В вузе дали тему курсовой: Графический векторный редакторДля реализации графики желательно использовать graphics

231
сортировка односвязного списка C++

сортировка односвязного списка C++

помогите, пожалуйста, с сортировкой односвязного спискаесть структура студент, формат фамилия_имя_отчество_возраст_успеваемость

240
Проблема передачи указателя на строку

Проблема передачи указателя на строку

Передаю _TCHAR указатель в функцию

158