2010-06-13 4 views
7

dire che ho queste classi viewA e viewBIn C++ ci sono eventi/delegati/interfacce/notifiche! nulla?

Nell'obiettivo C utilizzando il modello delegato ho potuto fare

@protocol ViewBDelegate{ 

- (void) doSomething(); 
} 

poi nell'interfaccia viewB:

id<ViewBDelegate> delegate; 

poi nella realizzazione viewA i set il delegato:

viewB.delegate = self; 

e ora posso chiamare doSomething da viewB su qualsiasi delegato di tipo sconosciuto.

[delegate doSomething]; 

"C++ Come programmare" è stato il peggiore letto un non riesce a trovare semplici esempi che dimostra modelli di progettazione di base.

Quello che sto cercando in C++ è:

  • eventi ActionScript e Java
  • o delegati o NSNotifications in Objective C

tutto ciò che permette di Classe A, Classe B e Classe C per sapere che ClassX ha fatto Qualcosa() !!!

grazie

risposta

9

Se fossi in te, non userei i puntatori di funzione per portare a termine questo compito. Lascia questa opzione ai guru;)

In Boost, c'è una bella biblioteca chiamata signals. Ti semplifica la vita! Questo è un esempio di utilizzo:

#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(); 
} 

questo stampa:

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

Ecco come funziona.

In primo luogo, si dichiara il luogo che contiene i delegati:

signal<void()> list_of_actions; 

Quindi, si "connette" a che cosa mai gruppo di funzioni/funtori/callable cose che si desidera chiamare.

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)); 

Nota, che ho utilizzato bind. Quindi, il tipo di funzioni in list_of_actions è lo stesso, ma possiamo collegarlo a diversi tipi di classi. Quindi:

bind(&A::A_action, a) 

Questa cosa, produce una cosa callable, di tipo void() come abbiamo dichiarato il tipo di list_of actions in precedenza. Ovviamente, si specifica l'istanza in cui si desidera applicare questa funzione membro nel secondo parametro.

Se si utilizzano elementi multi-thread, utilizzare la sorella signals2.

Spero che questo aiuti.

+0

ringrazia Arak per aver dedicato del tempo e aggiungendo l'esempio. questo conclude la mia ricerca. Brillante! – Bach

+0

una risposta superba. – Ross

2

Non ci sono delegati/eventi/ecc.

È possibile simulare interfacce utilizzando la pura funzione virtuale, vedere here per una domanda simile.

E ci sono il function pointers ...

Quindi, in pratica la risposta a voi domanda è no, ci sono niente di tutto questo in C++ (non so circa l'ultimo standard), ma ci sono sostituti e soluzioni ..

+0

grazie controllerò l'implementazione dell'interfaccia che dovrebbe fare. – Bach

1

Né il linguaggio C++ né la relativa libreria standard hanno delegati o eventi. Ci sono naturalmente molte librerie che implementano queste cose, oppure puoi implementarle tu stesso.

+0

grazie Neil. Sto davvero trovando difficile imparare la lingua, mi sono reso conto di quanto possa essere dannoso l'Objective C e Python! – Bach

+2

@Bach Quando si impara qualsiasi lingua, è importante non provare a trasferire i meme da altre lingue che conosci. C++ non è proprio come Python - Non posso parlare di Objective C. E nota che puoi fare delega in C++ - non fa parte del linguaggio. –

+0

Sono d'accordo Neil anche se non posso aiutarlo, perché so esattamente cosa voglio fare, e guardo come è fatto in altre lingue con cui ho lavorato, quindi cerco naturalmente di trovare l'equivalente in C++. Tutto parte della scoperta e dell'apprendimento suppongo. Verificherà tutti i suggerimenti qui. Stackoverflow ha battuto qualsiasi libro che ho letto su qualsiasi lingua, informativo e pieno di professionisti. grazie a tutti. – Bach

1

Tutto quello che so v'è un tipo di metodo chiamato richiamata metodo (In realtà, funzione di puntatore).

Delega? E 'solo un tipo di metodo di call-back avvolto, e, guarda avanzata

+0

grazie rhapsodyn. Suppongo di aver dato per scontato l'anticipo. niente di elegante sul C++ proveniente dall'obiettivo C. comunque grazie per l'aiuto. – Bach

5

tutto ciò che permette di Classe A, Classe B e Classe C sapere che ClassX didSomething() !!!

Probabilmente siete alla ricerca di signals & slots, che ha più implementazioni:

Sono sicuro che ci sono più, ma questi sono i più significativi di cui sono a conoscenza.

1

"C++ Come programmare" è stato il peggiore letto un non riesce a trovare semplici esempi che dimostra modelli di progettazione di base

Penso che the original Design Patterns book include esempi di come implementare ogni modello utilizzando C++.

2

Personalmente mi piace The Impossibly Fast C++ Delegates di Sergey Ryazanov. Implementazione molto accurata e facile da utilizzare, che si afferma essere più veloce di Boost::function.

Potete trovare eventi implementati anche lì. Io non li uso, comunque. Ho implementato la mia gestione degli eventi utilizzando lo stile .NET (mittente, args).

+0

Vale anche la pena osservare [Callback C++ generici leggeri (o ancora un'altra implementazione delegata)] (http://www.codeproject.com/Articles/136799/Lightweight-Generic-C-Callbacks- oppureYet-Another-Del). –