Funktionszeiger auf Funktion einer bestimmten Klassenfunktion
-
hi,
ich habe eine Instanz von
typedef void (*ProcessReport)(int,int); ProcessReport pProcessReport
und möchte nun in diese einen Zeiger auf eine Memberfunktion speichern:
class Cc { void func() { pProcessReport = func2; } void func2(int 1,int 2) { } };
wie mach ich das am besten?
-
Garnicht, denn ein Pointer-To-Member sieht anders aus:
typedef void (Cc::*ProcessReport)(int,int); ProcessReport pProcessReport = &Cc::func;
Logischerweise brauchst Du zum Aufrufen ein this-Objekt für die Methode:
objOfCc.*pProcessReport(0,0);
-
das ist das Problem^^
ich wöllte mich eben auf die Klasse nicht festlegen.
Geht das auch irgendwie das ich ein und die selbe Definition des FunctionPointers für mehrere Klassen nehmen kann?
-
Nein, nicht schön (kannst dir natürlich was Ekliges mit Casts bauen).
-
Hallo,
ich verzweifel hier gerade:
#include <iostream> #include <conio.h> class Clazz{ private: int i; public: Clazz(int i){this->i=i;} void mult(int i){ std::cout << this->i * i << std::endl; } void add(int i){ std::cout << this->i + i << std::endl; } }; typedef void (Clazz::*Method)(int); int main(int argc, char** argv) { Method meth1 = &Clazz::mult; Method meth2 = &Clazz::add; Clazz c1 = Clazz(3); Clazz c2 = Clazz(5); c1.*meth1(2); c1.*meth2(2); c2.*meth1(5); c2.*meth2(5); _getch(); }
Warum funktioniert das denn hier nicht?
must use .* or ->* to call pointer-to-member function in
meth1 (...)' bzw. must use .* or ->* to call pointer-to-member function in
meth2 (...)'
-
*argh*
(c1.*meth1)(2);
-
Also, ich hätte drei Lösungsansätze:
- Verwendung von virtuellen Methoden und überschreiben
- Verwendung von boost::bind, boost::mem_fn und boost::function,
- oder, vielleicht die schnellste Variante http://www.codeproject.com/cpp/FastDelegate.asp
Am elegantesten ist die erste Methode. Je nach Zweck können aber auch die anderen beiden vernünftig sein. Die zweite ist im TR1 enthalten und wird wahrscheinlich in C++0x standard sein. Bei der dritten bin ich mir nicht ganz sicher, aber sie ist auch recht portabel und vor allem schnell.
(Variante 1 ist auch sehr schnell, aber wenn Vererbung nicht passt, dann zwei oder drei, wobei drei wesentlich schneller ist, zwei aber flexibler).MfG
DDR-RAM
-
danke danke danke^^
ich habs einfach (naja nicht ganz ;)) mit ner zwischengeschalteten Funktion gemacht.