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.