Sie können einen Funktionszeiger auf void*
gegossen.
Wenn Sie einen Funktionszeiger auf eine Memberfunktion Punkt Sie die Art erklären müssen
ReturnType (ClassType::*)(ParameterTypes...)
Weiterhin können Sie nicht einen Funktionszeiger auf eine gebundene Elementfunktion deklarieren, z.B.
func_ptr p = &t1.get_pc // Error
Stattdessen müssen Sie die Adresse wie diese:
func_ptr p = &test::get_pc // Ok, using class scope.
Schließlich, wenn Sie einen Anruf an einen Funktionszeiger machen auf eine Elementfunktion zeigt, müssen Sie es mit einer Instanz der Klasse aufrufen dass die Funktion ein Mitglied von ist. Zum Beispiel:
(this->*cb_func)(); // Call function via pointer to current instance.
Hier ist das vollständige Beispiel mit allen Änderungen angewandt:
#include <iostream>
class test {
public:
typedef void (test::*callback_func_ptr)();
callback_func_ptr cb_func;
void get_pc();
void set_cb_ptr(callback_func_ptr ptr);
void call_cb_func();
};
void test::get_pc() {
std::cout << "PC" << std::endl;
}
void test::set_cb_ptr(callback_func_ptr ptr) {
cb_func = ptr;
}
void test::call_cb_func() {
(this->*cb_func)();
}
int main() {
test t1;
t1.set_cb_ptr(&test::get_pc);
t1.call_cb_func();
}
Ich finde immer http://www.newty.de/fpt/index.html sehr nützlich. – arne
Mitgliedsfunktionen sind keine Funktionen. Der Typ, den Sie brauchen, ist 'void (test :: *) (void *)' ... –
Kerrek SB hat Recht. Wenn Sie jedoch dasselbe Element für verschiedene Klassen und Instanzen aufrufen möchten, sollten Sie an Vererbung und virtuelle Elemente denken ... –