Re[3]: "Хитрый" проход по контейнеру полиморфных элементов.
От: ArtDenis Россия  
Дата: 18.01.04 19:10
Оценка: 2 (1)
Здравствуйте, Alxndr, Вы писали:

A>Боюсь, что это не решает самой проблемы, а именно: если завтра мне понадобится, чтобы менеджер умел выполнять над частью объектов еще пару операций (например, move(point), play_sound() etc.), снова придется лезть и переделывать game_object. Через несколько итераций мы получим "жирный" интерфейс: в классе game_object будет немалое количество методов-заглушек, созданных только для удовлетворения нужд какой-то ветви иерархии объектов .

A>Если исходник game_object.hpp не мой, это усугубит проблему.

Вот твой вариант 1.b. Но реализованный более удобно:

class manager
{
  ...
public:
  ...

  template <typename C> total_operation(void ( C::*method)() )
  {
    C *obj;
    for (Iterator it = objects_.begin(); it != objects_.end(); it++)
    {
      obj = dynamic_cast<C*>(*it);
      if (obj) (obj->*method)();
    }
  }
};

// где-то в коде:

// *** сериализация ***
manager_instance.total_operation<serializable_object>(&serializable_object::save);

// *** отрисовка ***
manager_instance.total_operation<drawable_object>(&serializable_object::draw);




У меня есть ещё несколько вариантов с шаблонами. Например, когда есть класс operation и его наследники, характеризующие выполняемые операции. В базовый класс игрового объекта в функцию make_operation передаётся нужная операция. Но этот вариант пока недоработанный (много спорных моментов).
... << RSDN@Home 1.1.2 stable >>
[ 🎯 Дартс-лига Уфы | 🌙 Программа для сложения астрофото ]
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.