Kurtze Frage: Ist es möglich ein Zeiger auf eine nicht statische Funktion zeigen zu lassen?
-
Kurtze Frage:
Ist es möglich ein Zeiger auf eine nicht statische Funktion zeigen zu lassen? Hab irgenwann mal was hier gelesen das es nicht geht. Stimmt das wirklich?
Meine Funktion:
bool SendTODOMessage(UINT unMessage, void * p){};
Mein Zeiger:
bool (*pSendTODOMessage)(UINT unMessage, void * p);
Meine zuweisung (nicht erlaubt oder?)
pSendTODOMessage = SendTODOMessage;
-
"Im Prinzip ja".
Es gibt zeiger auf Memberfunktionen, die kannst du aber nicht z.B. an eine Funktion geben, die einen Zeiger auf eine globale Funktion erwartet.
Der Syntax für memberfunktionen ist ein wenig neckisch:
// pointer auf member-Fkt: bool (CFoo::*pFunc)(int) = CFoo::DoSomething; // Aufruf braucht dann eine Instanz von CFoo: CFoo foo; (foo.*pFunc)(1); // bzw. CFoo * pFoo; (pFoo->*pFunc)(1);
Oder brauchst du einen member als Callback?
-
War zu langsamm *gr*
-
Also kann ich niemals eine nicht statische funktion an eine andere Klasse übergeben? Hab ich das so richtig verstanden? Dann muß ich das wohl mit Messages realtiesieren *gr*
-
Kannst du schon. Du brauchst aber eine Instanz der Klasse, um sie aufzurufen.
-
Die andere Klasse muß halt sagen daß sie "einen Funktionszeiger auf eine Memberfunktion von CFoo" haben will und nicht einen "globalen" Funktionszeiger.
Was willst du denn machen?
-
Wenn du eine Callback-Funktion für irgendeine API brauchst, haben die meistens noch einen User-Parameter. Dann kannst du eine statische Dummy-Funktion schreiben, die die Elementfunktion eines Objekts aufruft, das du über diesen Parameter übergibst.
Wenn du die Funktion, die den Funktionszeiger erwartet, selber schreibst, nimm lieber eine boost::function<> (www.boost.org) als Parameter. Dann kannst du über boost::bind einen Funktor erstellen, der die Elementfunktion eines bestimmten Objekts aufruft und diesen übergeben (natürlich auch weiterhin rohe Funktionszeiger).