Реализация событий в C ++ - PullRequest
4 голосов
/ 02 июня 2011

После некоторых исследований в интернете эффективного способа реализации событий в C ++ я обнаружил следующие методы

  • Интерфейсный класс - приложения могут переопределять виртуальные функции в производном классе
  • Обычный механизм обратного вызова с использованием указателей на функции
  • Делегаты, использующие Boost.function
  • Сигналы и слоты (как используется в Qt)

Я запутался в преимуществах и недостаткахкаждый из них и когда использовать кого-либо из этого.Какой метод самый лучший и почему?Есть ли другие решения, которые лучше перечисленных?

Ответы [ 4 ]

8 голосов
/ 02 июня 2011

FWIW, мой голос будет за Boost Signals в любой день.

Повышение обеспечивает мобильность.Конечно, он прекрасно интегрируется, например, с Boost Asio, Functional, Bind и т. Д.

Обновление:

Signals2

В этой документации описан поточно-ориентированный варианторигинальная библиотека Boost.Signals.В интерфейс были внесены некоторые изменения для поддержки безопасности потоков, в основном в отношении автоматического управления соединениями.[....]

Повышение обеспечивает мобильность.Конечно, он прекрасно интегрируется, например, с Boost Asio, Functional, Bind и т. Д.

boost :: signal2 :: signal sig;

sig.connect(&print_sum);
sig.connect(&print_product);
sig.connect(&print_difference);
sig.connect(&print_quotient);

sig(5., 3.);

Эта программа выведет следующее:

The sum is 8
The product is 15
The difference is 2
The quotient is 1.66667

примеры действий:

void print_sum(float x, float y)
{
  std::cout << "The sum is " << x+y << std::endl;
}

void print_product(float x, float y)
{
  std::cout << "The product is " << x*y << std::endl;
}

void print_difference(float x, float y)
{
  std::cout << "The difference is " << x-y << std::endl;
}

void print_quotient(float x, float y)
{
  std::cout << "The quotient is " << x/y << std::endl;
}
1 голос
/ 02 июня 2011

Вы проверили библиотеку GBL ?В нем есть все средства, которые вам могут понадобиться (и, возможно, больше) для равномерного проектирования.С его помощью вы можете создавать (реальные) модели, рассчитанные по времени и по времени.Это чистый C ++, не загрязненный макросами.Он также использует C ++ 0x для повышения производительности.Также, если вы используете компилятор C ++ 0x, вы получаете лямбда-функции, работающие как обработчики событий - это очень мощно.GBL поддерживает синхронные и асинхронные обработчики событий, потоки и волокна.Он абстрагирует поток событий через сигналы и порты.Благодаря некоторой изобретательности и тщательному дизайну вы можете использовать асинхронные обработчики событий и значительно повысить производительность в многоядерных / многопроцессорных системах.Он также имеет графический дизайнер и трассировщик.

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

0 голосов
/ 02 июня 2011

Вы можете использовать шаблон проектирования Observer. Вот пример C ++ источника этого. http://sourcemaking.com/design_patterns/observer/cpp/3

0 голосов
/ 02 июня 2011

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

Для двух других опций требуется соответственно использовать boost и Qt.

Преимущества/ Недостатки - это слишком широкий вопрос, и ответ во многом зависит от того, что вы делаете, в какой среде и с какой целью.

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