Zeiger
-
Hallo,
mich würde mal interessieren, wofür Funktionszeiger eigentlich gut sein sollen.
Danke
-
basti33 schrieb:
mich würde mal interessieren, wofür Funktionszeiger eigentlich gut sein sollen.
Sie sind immer dann gut, wenn ein Aufruf weiterdelegiert werden muss, weil die aktuelle Funktion keine Ahnung hat, wie sie mit etwas umgehen soll. Funktionszeuger sind Member-Funktionen recht ähnlich (gehen aber eher in die andere Richtung, daher auch der Begriff "callback").
Konkretes Beispiel: Ich habe eine Sortier-Funktion, die generisch sein soll, d.h. beliebige Objekte sollen sortiert werden. Das Sortieren ist stets vergleichsbasiert, d.h. die Funktion muss wissen, welches von zwei Objekten a und b das kleinere ist. Da die Funktion generisch ist, weiß die Funktion das aber. Daher übergebe ich der Funktion nicht nur das zu sortierende Array sondern außerdem auch eine Funktion, die das eben weiß:
template <typename T> void sort(std::vector<T> const& array, int (*compare)(T, T)) { // ... }Diese Vergleichsfunktion funktioniert so, dass eine negative Zahl zurückgegeben wird, wenn das erste Objekt kleiner ist, 0, wenn beide gleich sind und sonst eine positive Zahl. Sie könnte für zwei Integer z.B. einfach folgendermaßen aussehen:
int compare_int (int a, int b) { return a - b; }Jetzt kann man die 'sort'-Funktion so aufrufen:
std::vector<int> vec; // Vektor füllen ... sort(vec, &compare_int);
-
Danke für deine Antwort. So ganz verstanden habe ich es aber nicht.
Konrad Rudolph schrieb:
Da die Funktion generisch ist, weiß die Funktion das aber.
Meinst du: Da die Funktion generisch ist, weiß die Funktion das aber nicht?
Außerdem versteh ich irgendwie nicht, wieso man so was nicht mit überladenen Funktionen löst.Danke