Вот моя ситуация:
У меня есть система, управляемая событиями, где все мои обработчики являются производными от класса IHandler
и реализуют метод onEvent(const Event &event)
. Теперь Event является базовым классом для всех событий и содержит только перечислимый тип события. Все фактические события являются производными от него, включая событие EventKey
, которое имеет 2 поля: (uchar) keyCode
и (bool) isDown
.
Вот интересная часть: я генерирую событие EventKey
, используя следующий синтаксис:
Event evt = EventKey(15, true);
и я отправляю его обработчикам:
EventDispatch::sendEvent(evt); // void EventDispatch::sendEvent(const Event &event);
(EventDispatch
содержит связанный список IHandlers
и вызывает их метод onEvent(const Event &event)
с параметром, содержащим отправленное событие.
Теперь актуальный вопрос:
Скажем, я хочу, чтобы мои обработчики опрашивали события в очереди типа Event
, как мне это сделать?
Динамические указатели с подсчетом ссылок звучат как слишком большое решение.
Делать копии сложнее, чем кажется, так как я получаю только ссылку на базовый тип, поэтому каждый раз, когда мне нужно будет проверить тип события, увеличить значение до EventKey
, а затем сделать Копировать для хранения в очереди. Звучит как единственное решение - но неприятно, поскольку мне нужно было бы знать каждый тип события и проверять это для каждого полученного события - звучит как плохой план.
Я мог бы динамически распределять события, а затем отправлять указатели на эти события, ставить их в очередь, если необходимо, - но кроме подсчета ссылок - как бы я мог отслеживать эту память? Знаете ли вы, как реализовать очень легкий счетчик ссылок, который бы не мешал пользователю?
Как вы думаете, было бы хорошим решением для этого дизайна?