У меня есть класс, Mouse, чем обрабатывает события мыши.Он состоит из ряда статических функций для простых вызовов «где это и т. Д.», Но у него также есть несколько нестатических элементов, а именно некоторые средства обработки событий, когда он используется в качестве объекта.Однако у меня возникли проблемы с тем, как я могу разрешить любому объекту подписываться на события.В моем файле Mouse.h есть следующие объявления: (извините за синтаксические ошибки, это из памяти)
typedef void (*MouseEvent)(Point pos,MouseButton button)
class Mouse {
MouseEvent m_downEvent;
//...
void HookMouseDown(MouseEvent handler);
void OnMouseDown();
}
... и в реализации ...
void Mouse::HookMouseDown(MouseEvent handler) {
if (handler != NULL) m_downEvent = handler;
}
void Mouse::OnMouseDown() {
if (m_downEvent != NULL) m_downEvent(m_pos,m_button);
}
Теперь в коде моего подписчика казалось логичным подключить событие следующим образом:
m_mouse.HookMouseDown(&MyClass::MouseDown);
Но мой компилятор (MVC2008) не любитДело в том, что я передаю ему указатель на функцию-член, а не указатель на свободную функцию.После некоторых исследований я обнаружил, что при изменении typedef на
typedef void (MyClass::*MouseEvent)(Point pos,MouseButton button)
он не будет жаловаться и будет работать нормально, но проблема в том, что это ограничивает подписчиков на событие только объекты MyClass.Нужно ли мне подключать шаблоны, чтобы позволить любому объекту подписаться на эти события?Или это был бы плохой дизайн, позволяющий чему-либо потреблять события мыши?