В C++ там любые События/делегаты/интерфейсы/уведомления! что-нибудь?

Скажите, что у меня есть эти классы ViewA и ViewB

В цели C использование шаблона делегата я мог сделать

@protocol ViewBDelegate{

- (void) doSomething();
}

затем в интерфейсе ViewB:

id<ViewBDelegate> delegate;

затем в реализации ViewA я установил делегата:

viewB.delegate = self;

и теперь я могу звонить в doSomething от viewB на любой что неизвестный делегат типа.

[delegate doSomething];

"C++, Как Программировать", был худшим чтением, банка не находит простые примеры, который демонстрирует шаблоны базовой конструкции.

То, что я ищу в C++:

  • события ActionScript и Java
  • или делегаты или NSNotifications в Objective C

что-либо, что позволяет классу A, Классу B и Классу C знать тот ClassX didSomething ()!!!

спасибо

7
задан Bach 13 July 2012 в 07:19
поделиться

7 ответов

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

В Boost есть красивая библиотека под названием сигналы. Это делает вашу жизнь проще! Вот пример использования:

#include <iostream>
#include <boost/bind.hpp>
#include <boost/signal.hpp>
using namespace std;
using namespace boost;

struct A
{   void A_action() { cout << "A::A_action();" << endl; }   };
struct B
{   void B_action() { cout << "B::B_action();" << endl; }   };
struct C
{   void C_action() { cout << "C::C_action();" << endl; }   };
struct X
{
    // Put all the functions you want to notify!
    signal<void()> list_of_actions;
    void do_something()
    {
        std::cout << "Hello I am X!" << endl;
        list_of_actions(); // send notifications to all functions in the list!
    }
};
int main()
{
    X x;
    A a;
    B b;
    C c;
    x.list_of_actions.connect(bind(&A::A_action, a));
    x.list_of_actions.connect(bind(&B::B_action, b));
    x.list_of_actions.connect(bind(&C::C_action, c));
    x.do_something();
}

Это будет печатать:

Hello I am X!
A::A_action();
B::B_action();
C::C_action();

Вот как это работает.

Во-первых, вы объявляете место, где находятся делегаты:

signal<void()> list_of_actions;

Затем вы «подключаете» его к какой-либо группе функций/функторов/вызываемых объектов, которые вы хотите вызвать.

x.list_of_actions.connect(bind(&A::A_action, a));
x.list_of_actions.connect(bind(&B::B_action, b));
x.list_of_actions.connect(bind(&C::C_action, c));

Обратите внимание, что я использовал bind. Таким образом, тип функций в list_of_actions одинаков, но мы можем подключить его к разным типам классов. Итак:

bind(&A::A_action, a)

Эта вещь порождает вызываемую вещь типа void (), как мы объявили тип list_of действий ранее. Конечно, вы указываете экземпляр, к которому вы хотите применить эту функцию-член, во втором параметре..

Если вы занимаетесь многопоточными вещами, то используйте его родственные signals2.

Надеюсь, что поможет.

9
ответ дан 6 December 2019 в 08:41
поделиться

все, что разрешает класс A, класс B и класс C, чтобы знать, что ClassX didSomething () !!!

Вероятно, вы ищете сигналов и слотов , которые имеют несколько реализаций:

Я уверен, что их больше, но это наиболее важные из которых Я знаю.

5
ответ дан 6 December 2019 в 08:41
поделиться

Лично мне нравится The Impossibly Fast C++ Delegates Сергея Рязанова. Очень аккуратная и простая в использовании реализация, утверждается, что она быстрее, чем Boost::function.

Там же можно найти реализацию событий. Однако я их не использую. Я реализовал свою собственную обработку событий в стиле .NET (sender, args).

2
ответ дан 6 December 2019 в 08:41
поделиться

Все, что я знаю, существует метод, называемый обратным вызовом методом (на самом деле, указатель функции ).

Делегация? Это просто своего рода обернутый метод обратного вызова, который выглядит продвинутым

1
ответ дан 6 December 2019 в 08:41
поделиться

Ни язык C ++, ни связанная с ним Стандартная библиотека не имеют делегатов или событий. Конечно, существует множество библиотек, которые реализуют такие вещи, или вы можете реализовать их самостоятельно.

1
ответ дан 6 December 2019 в 08:41
поделиться

Нет делегатов, событий и т. Д.

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

И есть указатели на функции ...

Итак, в основном ответ на ваш вопрос - нет, в C ++ этого нет (не знаю о последнем стандарте), но есть замены и обходные пути ..

2
ответ дан 6 December 2019 в 08:41
поделиться

"C++ How to Program" было хуже читать и не могу найти простые примеры, демонстрирующих основные шаблоны проектирования

Я думаю, что оригинальная книга Шаблоны проектирования включает примеры того, как реализовать каждый шаблон с помощью C++.

1
ответ дан 6 December 2019 в 08:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: