005
01.10.2003, 12:48 Uhr
ao
(Operator)
|
Aaalso, mal ein bißchen ausholen.
Die Struktur ManagerOpInfoRec hat zwei Member, einen const char-Pointer und einen Funktionspointer. Beim Ausfüllen einer Instanz der Struktur kannst du diesen Pointer auf eine Funktion biegen, aber nicht auf irgendeine, sondern auf eine mit dieser Signatur:
C++: |
int irgendwas (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv);
|
Nehmen wir mal an, du hättest zwei Operationen: "Add" und "Subtract". Dazu gehören zwei Funktionen
C++: |
int AddOp (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv) { int nResult; /* nResult fuer Addition berechnen */ return nResult; }
int SubtractOp (const char *op_name, Boolean do_fork, unsigned int argc, char ** argv); { int nResult; /* nResult fuer Subtraktion berechnen */ return nResult; }
|
Und du erzeugst zwei Manager-Strukturen und füllst sie aus:
C++: |
ManagerOpInfoRec moirAdd = { "Add", AddOp }; ManagerOpInfoRec moirSubtract = { "Subtract", SubtractOp };
|
Dann kannst du anschließend mit einem gegebenen Parametersatz beide Funktionen aufrufen:
C++: |
int nResultAdd = moirAdd.func (moirAdd.op_name, false, nIrgendwas, ppIrgendwas); int nResultSubtract = moirSubtract.func (moirSubtract.op_name, false, nIrgendwas, ppIrgendwas);
|
Die ganze Leistungsfähigkeit dieses Konzepts erschließt sich aber erst, wenn du ein Array oder eine Liste, jedenfalls einen ganzen Haufen von ManagerOpInfoRec-Strukturen hast, wo du alle abeierst oder mit geeigneten Methoden eine raussuchst und dann über (*func) () die vorher hinterlegte Funktion aufrufst, wobei es dir in dem Moment egal ist, welche Funktion das tatsächlich ist.
Funktionspointer sind nicht ganz einfach zu verstehen, aber wenn mans einmal geschafft hat, sind sie ein sehr mächtiges Mittel.
ao |