Есть родительский класс с перегрузкой оператора +
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;//работает
мне нужно записать элемент в массив именно с помощью "+"
Что у вас с классами? Посмотрите на них: у вас используются указатели в классах, но при этом не видно ни деструкторов ни конструкторов копирования. Тобишь при уничтожение объекта память не будет освобождаться, а при копировании указатель просто задвоится, а не будет скопирована полезная информация.
Следующее: что это вообще за код?
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
? Классы не для этого были созданы, чтобы вот так с ними обращаться. Данные нужно скрывать и давать доступ только через соответствующие методы. Об инициализации должны заботится конструкторы, а об освобождении памяти - деструкторы. То что вы делаете (не заботитесь о инициализации, сохранении и правильном использовании данных) как раз и приводит к таким ошибкам.
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
В вузе дали тему курсовой: Графический векторный редакторДля реализации графики желательно использовать graphics
помогите, пожалуйста, с сортировкой односвязного спискаесть структура студент, формат фамилия_имя_отчество_возраст_успеваемость