Стоит задача разработать и реализовать графический редактор с набором примитивов (прямоугольники, эллипсы и т.д.), в котором возможна группировка этих примитивов в составные и работа с ними как с одним примитивом - как в Word группировка выделенных объектов. Я решил воспользоваться паттерном Компоновщик (Composity). Ниже представлен некий прототип реализации. Вообще примитивы будут отображаться на холсте.
Я решил хранить все объекты в контейнере m_DrawObjects
list<DrawingElement*> m_DrawObjects;
так называемый корень, хотя это не совсем корень, например можно создать root - корреной составной примитив и уже от него начинать в него класть все объекты.
Я пошел немного другим путём я с помощью итераторов перемещаюсь по контейнеру и перемещаю (перегруппировываю) примитивы. В самом низу представлено как всё происходит.
Вопрос: это вообще нормально сделано или как-то криво? Может быть есть способы более правильные? В книжки GoF пишется, про создание указателей на потомком, например - с этим еще не разобрался.
у меня например группировка осуществляется следующим образом: сначало добавляем необходимо примитив в какой-то составной объект
(*i_DrawObjects)->Add(*++m_DrawObjects.begin());
а потом удаляем его оттуда где он был
m_DrawObjects.erase(++m_DrawObjects.begin());
может быть способы более правильные и эффективные?
вот весь код
вот результат выполнения