@Nicky23

Как создать список из разных объектов классов?

Есть несколько классов:
class Figure { } // 1 Базовый
class Dot : public Figure { }
class Square : public Figure { }
class Circle : public Figure { }
class Decoration { } // Ещё один базовый
class Color : public Decoration { }
class Style : public Decoration { }
// И производный от них класс
class Ball : public Circle, public Color { }

Нужно сделать ещё несколько производных классов и все это добавить в список.
У меня решение такое:
list<Figure*> figure_list;
Ball* ball = new Ball();
// Тут для ball доступно всё что нужно
Figure* figure = ball; // Теперь я вроде как могу добавить этот объект в список
// Но если обращаться к методам figure, то будет не хватать несколько

Раз в figure лежит указатель на объект Ball, то как к нему обратиться? И можно ли вообще?
Просто если объектов в списке будет много, то не получиться обратиться к ранее созданным.
И правильно ли я вообще начал? Заранее спасибо)
  • Вопрос задан
  • 1089 просмотров
Решения вопроса 1
Во-первых, список (list) из Python — это не std::list, а std::vector в C++.

Во-вторых, чтобы избавиться от проблем с удалением объектов, вместо обычных указателей используй std::unique_ptr из #include <memory>.

Выглядеть управление объектами будет как-то так:
std::vector<std::unique_ptr<Figure>> figures;
std::vector<std::unique_ptr<Decoration>> decorations;

figures.push_back(std::make_unique<Ball>(аргументы для конструктора Ball));
figures[0]->какой-нибудь метод Figure


В-третьих, чтобы наследование не вызывало неопределённого поведения, тебе (в обычной жизни, если ты не гуру разработчик компилятора) обязательно нужно объявить виртуальный деструктор в базовом классе: virtual ~Figure() = default; + для Decoration.

В-четвёртых, по сути вопроса, чтобы иметь возможность сделать что-то полезное с Figure/Decoration, нужно добавить в них виртуальные функции (методы) C++ и вызывать примерно так, как я написал выше. Эту тему предлагаю освоить самому.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы