|
||||
|
ВведениеТак уж исторически сложилось, что в языке С++ нет событий. Событием (event) является исходящий вызов (программисты на VB хорошо знакомы с ними) и в С++ их действительно нет. Иногда события путают с сообщениями (message), но это не верно. Сообщение это прямой вызов: например windows вызывает оконную процедуру для передачи собщения окну. Объект (система) вызывает функцию обькта(окна). Вызов происходит от объекта к объекту. В отличии от сообщения событие имеет другую механику. Объект инициирует событие и вызываются все объекты-обработчики. Т.е. от одного объекта к нескольким. Причем объект инициатор события может ничего не «знать» об его обработчиках, поэтому событие называют исходящим вызовом. Раз уж в С++ события на уровне языка не поддерживаются, значит стоит организовать их на уровне библиотеки. Здесь приведена реализация такой библиотеки. В ней есть два класса signal и slot. Итак, чтобы сделать какой нибудь класс источником события поместите в него переменную типа signal: struct EventRaiser { // источник события signal<void> someEvent; // void – тип аргумента события }; А чтобы сделать класс обработчиком поместите в него переменную типа slot, функцию обработчик и свяжите slot с обработчиком: struct EventHandler { // обработчик события slot someHandler; // переходник void onEvent(void) { // функция обработчик события printf("event handled"); } void connect (EventRaiser& er) { someHandler.init(er.someEvent, onEvent, this); // установим связь события с обработчиком } }; Так как эти объекты являются частью своих хозяев, не нужно заботится о времени жизни связи. Ее разрыв произойдет во время разрушения одного из них. Событие же инициируется вызвовом метода signal::raise: struct EventRaiser { // источник события signal<void> someEvent; // void – тип аргумента события void someFunc() { someEvent.raise(); // инициация события } }; |
|
||
Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх |
||||
|