#include "HanlderClass.h" // тут объявлен класс, который хочет реагировать на сообщения
// вызывается парсером при получении определенного сообщения
int message_handler( int msgId, void* data, int dataLen )
{
Event evt = get_event( data, len );
handlerClass.messageReceived( evt );
return 0;
}
// где-то в другом файле
void someFunc()
{
Parser parser;
// парсер будет вызывать функцию message_handler при получении сообщения "Msg1"
parser.addMessage( "Msg1", message_handler );
parser.processStream();
}
Обрабока событий
Я посмотрел в других местах, но в qt и vcl используются языковые расширения, еще в двух библиотеках коллбэки обычные.
В данный момент я сделал тоже на коллбэках, но это не плохо тем, что приходится делать многие объекты глобальными, поскольку в функции нет возможности иначе к ним обращаться. Почти все пишу руками, поэтому доступ есть ко всем классам.
Есть у меня класс парсера сообщений(Parser), который я использую примерно так:
Код:
Мне не нравится необходимость доступности объявления объекта класса HandlerClass (часто это какая-нибудь левая надпись на экране(Label), которая обновляется при получении сообщения) при определении коллбэка.
Зачем парсеру знать, какие объекты должны получать сообщения? Это ваша ошибка проектирования - а никак не проблема коллбек-функций.
у меня парсер и не знает о существовании клиентов. Все что нужно, чтобы им пользоваться - определить и зарегистрировать(addMessage()) коллбэк, который ни от чего не зависит и является обычной самостоятельной функцией. Точно так же построены многие библиотеки.
Ах да, забыл сказать: виртуальные функции использовать нельзя;)
Поэтому я и не придумал, как использовать наблюдателя напрямую. У меня по сути и есть наблюдатель, только из эпохи чистого С, что мне и не нравится. )