Forum: PC-Programmierung verstehe typedef nicht


von Christian (Gast)


Lesenswert?

Hallo,
beim Durchlesen eines Quelltextes(C++) bin ich auf folgendes
gestoßen:

in einer Header-Datei werden 2 structs declariert und ein
typedef durchgeführt:

  struct vec{
  ...
  };

  struct situation{
  ...
  };

  typedef vec(value)(situation&);

in einer Implementierungsdatei .c wird dann eine Funktion
Jammer implementiert:

  vec Jammer( situation& s )
  {
   ...
  }
und in einer anderen Datei erscheint mal folgendes:
value Jammer;

Irgendwie verstehe ich denn Sinn des typedef hier nicht.
Kann mir mal einer auf die Sprünge helfen

Mfg
Christian

von Karl H. (kbuchegg)


Lesenswert?

Christian schrieb:

> Irgendwie verstehe ich denn Sinn des typedef hier nicht.
> Kann mir mal einer auf die Sprünge helfen

  typedef vec(value)(situation&);


Der typedef besagt, dass es einen Datentyp namens value gibt.
Ein 'value' ist eine Funktion die eine Referenz auf situation& als 
Argument akzeptiert und einen vec zurückliefert.


Höchst wahrscheinlich wirst du irgendwo im Programm eine 
Pointer-Variable finden

value* ptrFunc;

Das ist dann ein Funktionspointer. Diesem Pointer kann die Adresse einer 
Funktion zugewiesen werden. zb so


    ptrFunc = Jammer;

und die Funktion dann über den Pointer aufgerufen werden

  situation CurrentSituation;
  vec Result;

  Result = ptrFunc( CurrentSituation );


Soetwas hat man in C gerne gemacht um sog. Callbacks zu realisieren. 
Denk zb an qsort. qsort benötigt neben den eigentlichen Daten auch noch 
eine Funktion, welche für 2 Datenfelder einen Kleiner-Vergleich 
durchführt. Da dieser Vergleich aber vom genauen Aufbau der Daten 
abhängt, kann er nicht in qsort selbst gemacht werden. Daher muss man 
qsort auch noch die Adresse einer Funktion übergeben, welche das 
erledigt.

In C++ kann man die Sache mit Funktionspointern auch weiterhin so 
machen. Allerdings ist es oft vernünftiger, wenn die Callback 
Funktionalität über ein Interface eingefordert wird.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.