Как известно в С++ можно получить адрес функции члена только конкретного класса, что не затрудняет реализовать обмен событиями между объектами через callback. Обсуждений этой темы было уже много, повторяться не буду:
http://www.rsdn.ru/article/cpp/fastdelegate.xml
http://forum.developing.ru/showthread.php?p=12952#post12952
http://alenacpp.blogspot.com/
http://www.newty.de/fpt/index.html
http://dobrokot.nm.ru/cpp/CppMethodsCallback.html
Из специфики встраиваемых вытикают следующие ограничения: мин. потребление памяти, минимальное время вызова, использование кучи не жалательно, переносимость.
Я лично остановился на варианте интерфейсов, плюсы и минусы:
+ прозрачная реализация в стиле ООП
+ для вызова храним только один указатель, для 32бит проц. соответственно 4 байта
+ не использем кучу
+ можно объеденить однотипные события в один интерфейс (экономим память)
- нужна потдержка множественного наследования в компиляторе
- дополнительные расходы на размер кода при множественном наследовании (но вполне допустимые)
- для каждого типа/группы событий приходиться описывать класс интерфейса
- обработка событий от разных объектов и классов получается в одном методе, приходиться использовать switch (если это кретично, то можно обрабатывать события во вложенном классе слушателе который объявлен как друг)
Выглядет это примерно так:
//Интерфейс события мыши
class IMouseEvent {
private:
protected:
public:
virtual void OnMouseDown(void);
virtual void OnMouseUp(void);
virtual void OnClick(void);
};
//Интерфейс события клавиатуры
class IKeyEvent {
private:
protected:
public:
virtual void OnKeyDown(void);
virtual void OnKeyUp(void);
virtual void OnKeyPress(void);
};
//Базовый класс
class TControl {
private:
protected:
public:
IMouseEvent* OnMouseEvent;
IKeyEvent* OnKeyEvent;
};
//Окно
class TWindow: public TControl {
private:
protected:
public:
};
//Конкретное окно, добавлены инетерфейсы для обработки события
class TConcreteWindow: public IMouseEvent, public IKeyEvent, public TForm{
private:
protected:
public:
void OnClick(void);
virtual void OnKeyPress(void);
};