2010-06-13 2 views
7

Скажем у меня есть эти классы 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

ничего, что позволяет класса А, класс B и Class C знать, что ClassX didSomething() !!!

спасибо

ответ

9

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

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

#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 actions ранее. Конечно, вы указываете экземпляр, который хотите применить эту функцию-член во втором параметре.

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

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

+0

благодарит Арака за то, что вы нашли время и добавили пример. что завершает мой поиск. Brilliant! – Bach

+0

превосходный ответ. – Ross

2

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

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

И есть function pointers ...

Так в основном ответ на свой вопрос нет, есть ни того, что в C++ (не знаю, о последнем стандарте), но есть и обходные заменители ..

+0

спасибо, что я проведу реализацию интерфейса, которая должна это сделать. – Bach

1

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

+0

спасибо Нейлу. Мне действительно сложно изучать язык, я понял, как испортить Objective C и python! – Bach

+2

@Bach При изучении любого языка важно не пытаться переносить мемы с других языков, которые вы знаете. C++ на самом деле не похож на Python - я не могу говорить о Objective C. И обратите внимание, что вы можете выполнять делегирование на C++ - это просто не часть языка. –

+0

Я согласен с Нилом, хотя я не могу с этим поделать, так как я точно знаю, что я хочу делать, и я смотрю, как это делается на других языках, с которыми я работал, поэтому я, естественно, пытаюсь найти эквивалент в C++. Я полагаю, что все части обнаружения и обучения. Здесь вы найдете все предложения. Stackoverflow избил любую книгу, которую я читал о любом языке, информативном и полном профессионалов. всем спасибо. – Bach

1

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

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

+0

спасибо рапсудину. Наверное, я воспринял как нечто само собой разумеющееся. ничто не элегантно о C++, исходящем от объективного C. в любом случае спасибо за помощь. – Bach

5

ничего, что позволяет класс А, класс В и классе C, чтобы знать, что ClassX didSomething() !!!

Возможно, вы ищете signals & slots, который имеет несколько реализаций:

Я уверен, что есть больше, но они являются наиболее значимыми из что я знаю.

1

«C++ Как программировать» был хуже читать не может найти простые примеры, которые демонстрируют основные шаблоны проектирования

Я думаю, что the original Design Patterns book включает в себя примеры того, как реализовать шаблон с использованием C++.

2

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

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

+0

Также стоит обратить внимание на [Легкие общие обратные вызовы C++ (или, еще одна реализация делегата)] (http://www.codeproject.com/Articles/136799/Lightweight-Generic-C-Callbacks-or-Yet-Another-Del). –