нужна помощь, чтобы избежать удручения - PullRequest
3 голосов
/ 01 марта 2011

я создал упрощенную систему обработки событий, описываемую следующими классами

IEventType - containing string name and hashed int value of the name for fast search
IEventData - data send along with a triggered event
EventManager - containing a std::map of <int, boost::signals2< bool( boost::shared_ptr< IEventData > ) >

(есть и другие слушатели для побочных событий сценария lua и других, но я думаю, что сейчас это неактуально)

Реальная проблема заключается в следующем: когда я получаю IEventData, скажем:

class EData_WriteToConsole : IEventData
{
  std::string text;
  int layer;
  ...
}

, тогда я регистрирую некоторую функцию-член для сигнала:

OnWriteToConsole( boost::shared_ptr< IEventData > ){ ... }
m_EventManager->AddListener(boost::bind(&Console::OnWriteToConsole, m_Console, _1));

, а затем использую функцию TriggerEvent в EventManager

boost::shared_ptr< EData_WriteToConsole > eventData(new EData_WriteToConsole("Text..", 1));
m_EventManager->TriggerEvent(eventData);

наконец-то мое событие инициируется: но я не могу получить доступ к данным конкретного события EData_WriteToConsole, потому что OnWriteToConsole получает только базовый класс IEventData ptr.

, поэтому мне нужно уменьшить IEventData, который повышает ::shared_ptr указывает на производный класс EData_WriteToConsole.

В настоящее время я застрял, потому что мой мозг не выспался в последние дни, и я просто не могу придумать решение без уныния. Есть ли способ обойти это, могу ли я как-то реструктурировать свою иерархию классов, чтобы мне не нужно было выгружать? (я думал о создании std :: map с данными, которые передаются как eventdata, так и получающая функцияможет искать вещи, которые ему нужны, но для меня это кажется медленным и глупым), пожалуйста, помогите

1 Ответ

2 голосов
/ 01 марта 2011

Не могли бы вы поместить виртуальный метод в интерфейс IEventData, например, actionEvent (), который реализован в производных классах для вызова всего, что требуется для действия события?

Было бы немного ограничено, если бы событие нужно было обрабатывать несколькими различными способами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...