Пользовательские события в C ++? - PullRequest
8 голосов
/ 17 сентября 2008

Можно ли создавать собственные события в C ++? Например, скажем, у меня есть переменная X и переменная Y. Всякий раз, когда X изменяется, я хотел бы выполнить функцию, которая устанавливает Y равным 3X. Есть ли способ создать такой триггер / событие? (триггеры распространены в некоторых базах данных)

Ответы [ 5 ]

10 голосов
/ 17 сентября 2008

Это в основном экземпляр шаблона Observer (как уже упоминали и связывали другие). Тем не менее, вы можете использовать шаблон магии, чтобы сделать его немного более синтаксически палитрируемым. Рассмотрим что-то вроде ...

template <typename T>
class Observable
{
  T underlying;

public:
  Observable<T>& operator=(const T &rhs) {
   underlying = rhs;
   fireObservers();

   return *this;
  }
  operator T() { return underlying; }

  void addObserver(ObsType obs) { ... }
  void fireObservers() { /* Pass every event handler a const & to this instance /* }
};

Тогда вы можете написать ...

Observable<int> x;
x.registerObserver(...);

x = 5;
int y = x;

Какой метод вы используете для написания функций обратного вызова наблюдателя, полностью зависит от вас; Я предлагаю http://www.boost.org's функциональные или функциональные модули (вы также можете использовать простые функторы). Я также предупреждаю вас быть осторожным с перегрузкой операторов этого типа. Хотя это может сделать определенные стили кодирования более понятными, безрассудное использование рендера что-то вроде

кажется, LikeAnIntToMe = 10;

очень дорогостоящая операция, которая вполне может взорваться и стать причиной отладки кошмаров на долгие годы.

3 голосов
/ 17 сентября 2008

Повышающие сигналы - еще одна часто используемая библиотека, с которой вы можете столкнуться при создании паттерна Observer (также известного как Publish-Subscribe). Покупатель остерегается здесь, я слышал, что его производительность ужасна.

1 голос
/ 17 сентября 2008

Использовать шаблон Observer

пример проекта кода

вики-страница

1 голос
/ 17 сентября 2008

Думаю, вам следует прочитать немного о шаблонах проектирования , в частности, шаблоне наблюдателя .

Qt из Trolltech реализовали замечательные решения, которые они называют Сигналы и слоты .

0 голосов
/ 17 сентября 2008

Насколько мне известно, вы не можете сделать это с переменными по умолчанию, однако, если вы написали класс, который принял функцию обратного вызова, вы могли бы позволить другим классам регистрироваться, что они хотят получать уведомления о любых изменениях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...