9 Stimmen

Gibt es in C++ irgendwelche Events/Delegates/Schnittstellen/Benachrichtigungen! irgendetwas?

Angenommen, ich habe diese Klassen AnsichtA und AnsichtB

In Objective C könnte ich unter Verwendung des Delegatenmusters Folgendes tun

@protocol ViewBDelegate{

- (void) doSomething();
}

dann in der ViewB-Schnittstelle:

id<ViewBDelegate> delegate;

dann in ViewA Implementierung setze ich den Delegaten:

viewB.delegate = self;

und jetzt kann ich in doSomething von viewB auf jede, die unbekannten Typ Delegaten aufrufen.

[delegate doSomething];

"C++ How to Program" war die schlechteste Lektüre, und ich kann keine einfachen Beispiele finden, die grundlegende Entwurfsmuster demonstrieren.

Was ich in C++ suche, ist:

  • Veranstaltungen ActionScript und Java
  • oder Delegierte oder NSNotifications in Objective C

alles, was es Klasse A, Klasse B und Klasse C ermöglicht, zu wissen, dass KlasseX didSomething()!!!

danke

9voto

Khaled Alshaya Punkte 90854

An Ihrer Stelle würde ich keine Funktionszeiger verwenden, um diese Aufgabe zu erfüllen. Überlassen Sie diese Option den Gurus ;)

In Boost gibt es eine wunderschöne Bibliothek namens Signale . Es macht Ihr Leben einfacher! Dies ist ein Beispiel für die Verwendung:

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

Dies wird gedruckt:

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

Das funktioniert folgendermaßen.

Zunächst geben Sie den Ort an, an dem sich die Delegierten befinden:

signal<void()> list_of_actions;

Dann "verbinden" Sie es mit einer beliebigen Gruppe von Funktionen/Funktoren/aufrufbaren Dingen, die Sie aufrufen möchten.

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

Beachten Sie, dass ich die bind . Damit ist der Typ der Funktionen in der list_of_actions derselbe, aber wir können sie mit verschiedenen Typen von Klassen verbinden. So:

bind(&A::A_action, a)

Dieses Ding erzeugt ein aufrufbares Ding vom Typ void () da wir den Typ von list_of actions früher. Natürlich geben Sie im zweiten Parameter die Instanz an, auf die Sie diese Mitgliedsfunktion anwenden wollen.

Wenn Sie Multithreading betreiben, dann verwenden Sie die Schwester Signale2 .

Ich hoffe, das hilft.

5voto

sml Punkte 2102

alles, was es ermöglicht und Klasse C zu wissen, dass KlasseX didSomething()!!!

Wahrscheinlich suchen Sie Signale & Schlitze die mehrfach implementiert wurde:

Ich bin sicher, es gibt noch mehr, aber das sind die wichtigsten, die mir bekannt sind.

2voto

Unknown Punkte 5466

Es gibt keine Delegierten/Ereignisse/etc.

Sie können Schnittstellen mit reinen virtuellen Funktionen simulieren, siehe aquí für eine ähnliche Frage.

Und es gibt die Funktionszeiger ...

Also im Grunde die Antwort auf Ihre Frage ist nein, es gibt keine davon in C++ (weiß nicht über den neuesten Standard), aber es gibt Ersatz und Workarounds.

2voto

Aoi Karasu Punkte 3635

Ich persönlich mag Die unfassbar schnellen C++-Delegierten von Sergey Ryazanov. Sehr saubere und einfach zu bedienende Implementierung, die angeblich schneller ist als Boost::function .

Sie können dort auch Veranstaltungen finden. Ich benutze sie allerdings nicht. Ich habe meine eigene Ereignisbehandlung im .NET-Stil implementiert (Absender, Args).

1voto

Weder die Sprache C++ noch die zugehörige Standardbibliothek haben Delegierte oder Ereignisse. Natürlich gibt es viele Bibliotheken, die solche Dinge implementieren, oder Sie können sie selbst implementieren.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X