problem mit statischer callback funktion
-
hi leute,
ich habe ein problem mit einer callback funktion. Diese muss ja static sein, das problem ist, ich kann dieser kein object der klasse übergeben, weil ich die signatur der funktion nicht aendern darf, die callback function wird bei einer anderen funktion registriert.
nun die frage darf man einen statischen pointer der klasse den this pointer zuweisen (von der klasse foo gibts nur eine instanz!) und dann ueber den statischen pointer auf die elemente der klasse zugreifen, der member i darf auch nicht statisch sein, sonst wärs ja leicht;)bye
class foo { public: foo(); static foo *ptr_foo; static void callback_function(); private: int i; }; foo::foo() { ptr_foo = this; i = 10; } void foo::callback_function() { ptr_foo->i = 0; }
-
this nach void* casten und als parameter an die callback funktion übergeben. in der callback wieder zurückcasten, dann kannst du auf die member des objektes zugreifen

-
ich darf die signatur der callback funktion nicht aendern! -> geht also nicht:
this nach void* casten und als parameter an die callback funktion übergebenbye
-
signatur sieht so aus:
void foo::callback_function(BL_signal_t signal)ich darf da keinen void* als param hinzufuegen;/
-
Dein Ansatz funktioniert. Du musst nur sicherstellen, dass der Pointer wirklich vor Benutzung des Callbacks initialisiert wird. Und natürlich hast du ein Problem, sobald du doch mehr als eine Instanz von foo verwenden willst.
Felix
-
warum sagt der compiler dann:
undefined reference to `foo::ptr_foo'bye
-
Weil die Definition von ptr_foo fehlt.
-
gibt ja hier:
class foo { public: static foo *ptr_foo;
-
Das ist die Deklaration. Die Definition steht in der cpp-Datei und heißt
foo* foo::ptr_foo = NULL;
-
Ich würde das ganze mit Proxys machen
So in der Art:
class Foo { public: int foo(int iParam) {} static int fooProxy(int iParam, void *pAdditionalData) { Foo *pFoo= reinterpret_cast<Foo*>(pAdditionalData); return(pFoo->foo(iParam)); } }; ... typedef int (*PFNFOOPARAM)(int, void *); ... void Call(PFNFOOPARAM Fn, void *pParam) { (*Fn)(3, pParam); } ... Foo test; Call(&Foo::fooProxy, &test);
-
ist auch eine möglichkeit!
wie gesagt ich kann die signatur der callback funktion nicht aendern!
die muss so sein:
void callback_function(BL_signal_t signal);