Я делаю игровой движок на C ++. Предполагается, что он считывает всю свою логику игрового уровня из файлов XML, поэтому мне нужен простой, но надежный способ создания и обработки событий. Пока все, что я сделал, это использовал класс Action. Это практически эквивалентно выбрасыванию обратных вызовов.
Примером может служить объект (карта), который может изменить сцену, если щелкнуть по нему. Что меня беспокоит, так это то, что я хочу иметь возможность удалять сцену, не беспокоясь обо всех объектах, которые использовали для ее активации.
Существует ли общепринятый способ сделать это? До сих пор я делал так, чтобы все зависимые / надежные объекты наследовали зависимый / надежный класс. Класс предоставляет им список объектов, которые зависят от них или от которых они зависят.
class Dependent
{
protected:
Dependent();
/// Warning all connected \ref Dependent that the Dependent does not exist.
~Dependent();
/// Connected Dependent \see connect(Dependent*, Dependent*)
std::list<Dependent*>* dependents;
/// Register a Dependent.
void newDependent(Dependent*);
/// Check if dependent on the given Dependent.
bool listeningTo(const Dependent*) const;
/// Used by a destructing connected Dependent to warn that it no longer exists.
void stopListening(Dependent*);
friend void connect(Dependent*, Dependent*);
};
Все это только для возможности проверить, прекратил ли элемент существование. Не существует автоматической проверки того, что объекты не вызывают другой объект после удаления, но я могу выполнить проверку, не беспокоясь об использовании указателя, который ведет в никуда.
Я надеюсь, что есть более элегантный способ сделать это.