Callbacks in STL Containern?
-
Hallo,
ich wollte mir gestern einen Vektor mit Callback-Funktionen erstellen.
Bspw. so:
typedef int (*BlaCallback)(); // ... std::vector<BlaCallback> myVec; // ... myVec[0](); // Callback aufrufenLeider geht das so nicht, denn ich bekomme einen (compilerspezifischen) Linkerfehler.
Ich gehe davon aus, dass das damit zusammen hängt, dass die Callbackfunktionen ja eigentlich keine Objekte sind und die STL damit vermutlich nicht zurecht kommt.
Meine Frage nun:
Kann man das dennoch irgendwie in STL Container packen, ohne gleich Wrapperklassen etc. zu nutzen (Funktionenobjekte will ich nicht)?PS.: Stimmt es, dass die Überprüfung von einem Zeigen bei delete unnötig ist?
int* pointer = new int(10); // ... if (pointer) { // Eigentlich nicht nötig, da delete auf NULL-Zeiger überprüft delete pointer; pointer = NULL; }
-
Hallo,
bei mir geht das (VS2005 SP1):
typedef int (*func)() ; int hallo(){ return 0; } int tschau() { return 1; } int main(void){ std::vector< func> test; test.push_back(hallo); test.push_back(tschau); for (std::vector<func>::iterator iter = test.begin(); iter != test.end(); iter++) { std::cout << (*iter)() << std::endl; } return test[0](); }
-
zehplüsplüs schrieb:
...
Ich gehe davon aus, dass das damit zusammen hängt, dass die Callbackfunktionen ja eigentlich keine Objekte sind und die STL damit vermutlich nicht zurecht kommt. ...Also das sind einfach Pointer und ich sehe keinen Grund, warum da eine (std-konforme) STL ein Problem mit haben sollte.
Ich vermute, dass es eher an der "Referenzierung" (also der Stelle, an der Du myVec füllst) liegt.zehplüsplüs schrieb:
...
Funktionenobjekte will ich nicht ...Warum eigentlich nicht ?
Gruß,
Simon2.
-
zehplüsplüs schrieb:
PS.: Stimmt es, dass die Überprüfung von einem Zeigen bei delete unnötig ist?
int* pointer = new int(10); // ... if (pointer) { // Eigentlich nicht nötig, da delete auf NULL-Zeiger überprüft delete pointer; pointer = NULL; }Ja, delete prüft auf NULL.
-
simon.gysi schrieb:
...Ja, delete prüft auf NULL.
2 Anmerkungen:
- camper hat hier mal auf Situationen verwiesen, in denen ein 0-Abfrage trotzdem sinnvoll war (war aber zu abgefahren, um es mir zu merken
) - eine Prüfung auf ein "double delete" ist aber weiterhin absolut notwendig. D.h. das anschließende "0-Setzen" braucht's weiterhin!!
Gruß,
Simon2.
- camper hat hier mal auf Situationen verwiesen, in denen ein 0-Abfrage trotzdem sinnvoll war (war aber zu abgefahren, um es mir zu merken