|
Objektorientiertes Programmieren mit C++ und JAVA
|
|  
|
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) ...