У меня возникла ситуация, когда я хотел бы получить каждый производный экземпляр System
, чтобы подписаться на событие через мою собственную систему событий. В основном это означает передачу std :: function в событие, которое является полем члена другого экземпляра. Так что это в основном так:Вызов метода производного класса из конструктора базового класса
// System.h
class System
{
public:
System(std::shared_ptr<EntityManager> entityManagerPtr);
virtual ~System();
virtual void componentAddedEventHandler(void* source, const ComponentAddedEventArgs& args);
protected:
std::shared_ptr<EntityManager> m_entityManagerPtr;
};
И реализации, с помощью делегата:
// System.cpp
System::System(std::shared_ptr<EntityManager> entityManagerPtr) : m_entityManagerPtr(entityManagerPtr)
{
// Subscribe to the componentAddedEvent
m_entityManagerPtr->componentAddedEvent += [&](void* source, ComponentAddedEventArgs args) {
this->componentAddedEventHandler(source, args);
};
}
Но очевидно, что это не будет компилироваться без определения System::componentAddedEventHandler()
.
Что было бы лучшим способом обеспечить, чтобы каждый класс, полученный из System
, подписался на это событие, и все они должны были определить свою собственную реализацию для обработчика событий? Или слишком неудобно принуждать такое поведение, чтобы оно могло быть достигнуто каким-то другим способом?
Да, я действительно нашел дискуссию по теме, но на самом деле это не отвечало на мой вопрос. То, как я это вижу, такое поведение невозможно без а) двухфазной инициализации или б) некоторых вспомогательных классов. В этом случае мне бы хотелось доказать, что это неправильно, и я имею в виду, что может быть более элегантное решение этой проблемы. –
Можете ли вы предоставить более подробную информацию о том, что вы на самом деле пытаетесь сделать? Прямо сейчас моя кишка говорит, что вы передумали это. –
не злоупотребляйте своей объектной моделью ... если базовый класс должен что-то сделать, реализуйте его там. –