Скажите, что у меня есть эти классы ViewA и ViewB
В цели C использование шаблона делегата я мог сделать
@protocol ViewBDelegate{
- (void) doSomething();
}
затем в интерфейсе ViewB:
id<ViewBDelegate> delegate;
затем в реализации ViewA я установил делегата:
viewB.delegate = self;
и теперь я могу звонить в doSomething от viewB на любой что неизвестный делегат типа.
[delegate doSomething];
"C++, Как Программировать", был худшим чтением, банка не находит простые примеры, который демонстрирует шаблоны базовой конструкции.
То, что я ищу в C++:
что-либо, что позволяет классу A, Классу B и Классу C знать тот ClassX didSomething ()!!!
спасибо
Если бы я был на месте вас, я бы не использовал указатели функций для выполнения этой задачи. Оставьте эту опцию гуру ;)
В 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.
Надеюсь, что поможет.
все, что разрешает класс A, класс B и класс C, чтобы знать, что ClassX didSomething () !!!
Вероятно, вы ищете сигналов и слотов , которые имеют несколько реализаций:
Я уверен, что их больше, но это наиболее важные из которых Я знаю.
Лично мне нравится The Impossibly Fast C++ Delegates Сергея Рязанова. Очень аккуратная и простая в использовании реализация, утверждается, что она быстрее, чем Boost::function
.
Там же можно найти реализацию событий. Однако я их не использую. Я реализовал свою собственную обработку событий в стиле .NET (sender, args).
Все, что я знаю, существует метод, называемый обратным вызовом методом (на самом деле, указатель функции ).
Делегация? Это просто своего рода обернутый метод обратного вызова, который выглядит продвинутым
Ни язык C ++, ни связанная с ним Стандартная библиотека не имеют делегатов или событий. Конечно, существует множество библиотек, которые реализуют такие вещи, или вы можете реализовать их самостоятельно.
Нет делегатов, событий и т. Д.
Вы можете моделировать интерфейсы, используя чистую виртуальную функцию, см. здесь для аналогичного вопроса.
И есть указатели на функции ...
Итак, в основном ответ на ваш вопрос - нет, в C ++ этого нет (не знаю о последнем стандарте), но есть замены и обходные пути ..
"C++ How to Program" было хуже читать и не могу найти простые примеры, демонстрирующих основные шаблоны проектирования
Я думаю, что оригинальная книга Шаблоны проектирования включает примеры того, как реализовать каждый шаблон с помощью C++.