Обработка событий в С++ | страница 2
> void onEvent(const char *eventName) { // обработчик события
> printf("\t%s event handled in %s object\n", eventName, color);
> }
> EventHandler(const char *clr): color(clr) {
> handler.init(g_Raiser.event, onEvent, this); // установим связь
> }
>};
>int main(int argc, _TCHAR* argv[]) {
> EventHandler red("Red");
> g_Raiser.raise("Small"); // событие обработается в red
> {
> {
> EventHandler blue("Blue");
> g_Raiser.raise("Big"); // событие обработается в red и blue
> }
> EventHandler green("Green");
> g_Raiser.raise("Medium"); // событие обработается в red и green.
> // объект blue уничтожен, связь разорвана
> }
> return 0;
>}
Краткое описание классов
signal – cобытие (детали реализации опущены)
>template
>class signal {
>public:
> // Инициировать событие
> void raise(
> Arg arg // Арумент arg будет передан в обработчики события
> );
>};
slot – переходник для обработки события в классе-обработчике (детали реализации опущены)
>class slot {
>public:
> // установить связь с событием и обработчиком
> template <
> class Owner, // класс-обработчик
> class Arg // Тип аргумента события.
> >
> void init(
> signal
> void (Owner::*mpfn)(Arg), // функция обработчик
> Owner *This // обьект обработчик
> );
> // установить связь с событием и обработчиком для случая signal
> template <
> class Owner // класс-обработчик
> >
> void init(
> signal
> void (Owner::*mpfn)(), // функция обработчик
> Owner *This // обьект обработчик
> );
> // разорвать связь
> void clear();
>};
Исходный код
Весь код находится в файле sigslot.h
>#ifndef _SIGSLOT_h_
>#define _SIGSLOT_h_
>// sigslot.h – autor Kluev Alexander kluev@pragmaworks.com
>template
>class signal;
>class slot {
> friend class signal_base;
> slot *_prev;
> slot *_next;
> struct Thunk {};
> typedef void (Thunk::*Func)();
> Thunk *_trg;
> Func _mfn;
>public:
> slot(): _trg(0), _mfn(0), _prev(0), _next(0) {}
> ~slot() {clear();}
>public:
> void clear() {
> if (_next) _next->_prev = _prev;
> if (_prev) _prev->_next = _next;
> _prev = _next = 0;
> }
> template
> void init(signal
> clear();
> _trg = (Thunk*)This;
> _mfn = (Func)mpfn;
> sig._add(*this);
> }
> template
> void init(signal
> clear();
> _trg = (Thunk*)This;
> _mfn = (Func)mpfn; sig._add(*this);
> }
>private:
> template
> void _call(Arg a) {
> typedef void (Thunk::*XFunc)(Arg);