Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Do Mai 16, 2024 00:06

Foren-Übersicht » Programmierung » Allgemein
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Mo Okt 22, 2012 18:06 
Offline
DGL Member

Registriert: Sa Okt 18, 2008 11:59
Beiträge: 180
Seid gegrüßt DGler,

ich habe einen TimerManager gebaut der eine Time Klasse beinhaltet, die einen Integer für die Sekunden und einen double für den Nachkommateil nutzt.
Der Manager ruft Funktionen die als Funktionspointer übergeben wurden auf, wenn ihre Time-Eigenschaft kleinergleich (also früher) als die jetzige ist.
Momentan müssen diese Funktionen 2 Parameter beinhalten, einen Integer und einen Double, und ich würde gerne das ich ohne große Umwege auch Funktionen die ein Time-Objekt als Parameter haben benutzt werden können. Dies müsste eigentlich gehen, da die Time-Klasse dieselben Datentypen in derselben Reihenfolge beinhalten.
Geschrieben ist der Code in C/C++.

Grüße


Nach oben
 Profil  
Mit Zitat antworten  
BeitragVerfasst: Mo Okt 22, 2012 20:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Also hier gibt es verschiedene Lösungen:
1. Wenn eines Instanz des TimerManagers nur eine Funktion aufruft und keine Liste von Callbacks, bietet sich eine Template-Lösung an. Du übergibtst einfach den Typ des Funktionspointers als Template-Parameter an und implementierst dafür entsprechene Spezialisierungen.

2. Du benutzt virtuelle Funktionen. Also eine Basisinterface "Callback" und davon für beide Fälle eine Interface ableiten. Die Empfänger deines Callbacks müssen dann das jeweilige Interface implementieren.

3. Du benutzt Delegates. Du nutzt quasi ein Delegate-Objekt als Übersetzer zwischen der Polymorphie aus 2. und deinen Funktionspointern. Das folgende ist jetzt nur schnell runtergetippt, kann man sicher schöner lösen, mit Templates oder so.

Code:
  1. class Delegate
  2. {
  3. public:
  4.     virtual void Call(const Time& _time) = 0;
  5. };
  6.  
  7. class PairDelegate : public Delegate
  8. {
  9. public:
  10.     typedef void (*FDelegate)(int, double);
  11.  
  12.     PairDelegate(FDelegate _delegate)
  13.         : m_delegate(_delegate)
  14.     { }
  15.  
  16.     void Call(const Time& _time)
  17.     {
  18.         m_delegate(_time.seconds, _time.fraction);
  19.     }
  20.  
  21. private:
  22.     FDelegate m_delegate;
  23. };
  24.  
  25. class TimeDelegate : public Delegate
  26. {
  27. public:
  28.     typedef void (*FDelegate)(const Time&);
  29.  
  30.     TimeDelegate(FDelegate _delegate)
  31.         : m_delegate(_delegate)
  32.     { }
  33.  
  34.     void Call(const Time& _time)
  35.     {
  36.         m_delegate(_time);
  37.     }
  38.  
  39. private:
  40.     FDelegate m_delegate;
  41. };

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Foren-Übersicht » Programmierung » Allgemein


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.023s | 17 Queries | GZIP : On ]