Axel Rogat
Objektorientiertes Programmieren mit C++ und JAVA
 
7.8: inline-Funktionen Kapitel 7 7.10: Die Funktion main 
 
  7.9 Pointer auf Funktionen  
 

Funktionen können in C++ behandelt werden wie auch andere Objekte. Beispielsweise können Pointer auf sie definiert werden, Arrays von solchen Pointern angelegt werden, etc.

Der Name einer Funktion alleine (z.B. sin) steht für einen Pointer auf die Funktion. Entsprechend kann man Funktionen aufrufen, indem man eine Parameterliste in Klammern hinter einen Funktions-Pointer setzt (z.B. sin(1.0)).

Eine Deklaration für einen Pointer funcp auf Funktionen mit dem Prototyp

void func(int,int);
ist folgende:
void (*funcp)(int,int);
Die Klammern um * funcp sind notwendig, weil die Klammern () der Parameterliste stärker binden als der Stern. Daher würde mit
void *funcp(int,int);
eine Funktion funcp deklariert, die einen Pointer auf void zurückliefert.

Funktionspointer werden behandelt wie normale Variablen. Man kann beispielsweise Arrays von ihnen anlegen und sie als Parameter in Funktionsaufrufen verwenden.

Beispielsweise kann mit einem Array von Funktionspointern leicht eine Auswahl aus mehreren Funktionen realisiert werden, z.B. zur grafischen Darstellung:

double (*stdfunx[])(double)= { sin, cos, tan, log, exp };
Der Benutzer könnte dann menüartig auswählen:
int num; do { cout << "Bitte geben Sie die Nummer der Funktion ein (1..5): "; cin << num; } while (num<0 || num>5); if (num!=0) PlotFunction(stdfunx[num-1]);
Die Grafikfunktion sähe etwa wie folgt aus:

void PlotFunction(double (*func)(double)) { double x; ... WritePixel(...func(x)...); }
Funktionen können nicht mit typedef neue Typnamen erzeugen, wohl aber Pointer auf Funktionen. Für unser Beispiel wäre folgende Definition sinnvoll:
typedef double (*funcp)(double);
Die beiden vereinfachten (und lesbareren) Zeilen aus den anderen Programmteilen sehen dann so aus:
funcp stdfunx[]= { sin, cos, tan, log, exp }; void PlotFunction(funcp func) ...

 
7.8: inline-Funktionen Startseite 7.10: Die Funktion main 
 

© 1998 Axel Rogat