funktionspointer problem
-
Problem:
class foo { public: long func (); }; int main () { long (*PointerToFunc) (); foo bar; PointerToFunc = bar.func; // oops, das funzt nicht }Lösung 1:
class foo { public: long func (); }; foo bar; long tempfunc () { return bar.func (); } int main () { long (*PointerToFunc) (); PointerToFunc = tempfunc; }Wie mal leicht sehen kann, bin ich damit nicht glücklich. bar muss Global sein, und es wird eine zusätzliche Funktion benötigt. casten hab ich versucht, hat nicht geklappt. Hat jemand ne elegante Methode?
-
Die Dinger für Methoden heißen dann logischerweise Methodenpointer.
Gruß
-
-
#include <iostream> class foo { public: long func () { std::cout << "Called Method: long foo::func() and return value = "; return 10; } }; int main () { // Zeiger auf Methode func() von foo long (foo::*PointerToFunc) (); foo bar; // Methodenzeiger zuweisen PointerToFunc = &foo::func; // Methodenzeiger aufrufen std::cout << (bar.*PointerToFunc)() << std::endl; }Edit: Btw Hurra die 1000 sind voll *g*
-
oh, ich hab vergessen zu erwähnen, dass der Funktionspointer nicht verändert werden darf. Denn er kommt aus eine dll, die ich nicht selbst geschrieben habe. Sonst wär meine Frage wirklich n bisser dümmlich, geb ich zu.
-
Dann brauchst Du aber eine Möglichkeit das dazugehörige Objekt zu identifizieren. Dein Callback gibt anscheinend keine Möglichkeit dazu.
Üblicherweise sind solche Callback-APIs so gehalten, dass man einen Wert beim Registrieren mitgibt, der bei jedem Aufruf des Callbacks wieder zurückgegeben wird.
In deinem Fall hilft Dir vielleicht ein Singleton weiter.
-
*schäm* ich muss feststellen, dass ich heute die selbe Frage neu gestellt hab...
Aber irgendwie ist die Suchfunktion auch nicht so ideal
Also, hier meine Lösung:
class Test { public: void foo () { return; } }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Test t; void (Test::*pTestFkt)(); pTestFkt = &Test::foo; (t.*pTestFkt)(); return 0; }Das klappt bei mir.
Viele Grüße,
Matthias
-
fehlersucher schrieb:
*schäm* ich muss feststellen, dass ich heute die selbe Frage neu gestellt hab...
Aber irgendwie ist die Suchfunktion auch nicht so ideal
Also, hier meine Lösung:
class Test { public: void foo () { return; } }; int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { Test t; void (Test::*pTestFkt)(); pTestFkt = &Test::foo; (t.*pTestFkt)(); return 0; }Das klappt bei mir.
Viele Grüße,
Matthias
klar, bei mir auch!
Leider kann ich aber keinen solchen Pointer verwenden, da ich den vorgefertigten verwenden muss.