По моему опыту, вы должны использовать гибридные сигналы / слоты внутри абстрактного класса, главным образом потому, что шаблон Listener не очень хорошо работает на C ++, поскольку внутренние классы имеют нулевую видимость по сравнению с внешним классом (как в Java, например,), что делает вставку слушателей очень сложной задачей.Таким образом, вы можете использовать великолепные Gallant Signals , ведь это очень быстрая реализация шаблона делегата / сигнала:
class EntityProvider {
public:
Gallant::Signal0< Entity* > onEntityCreate;
};
и кода, который вы используете провайдер:
void Example::bindProvider(EntityProvider* provider) {
provider->onEntityCreate.Connect(this, &Example::onEntityCreate);
}
Кроме того, чтобы улучшить дизайн ОО, вы должны использовать класс «gluer», который отвечает за привязку / открепление классов к своим провайдерам.Это хорошо, чтобы централизовать управление событиями и избежать трудных для отладки проблем.