<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Wie am besten eine Eventklasse implementieren?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in meinem Programm Keyevents in einer eigenen Klasse behandeln. Das ganze läuft nach dem &quot;Gedrückt wenn...&quot; Prinzip ab, sobald also eine bestimmte Taste gedrückt wurde, wird das Event ausgelöst, und eine zugeordnete Funktion aufgerufen, die dann das Event behandelt. Nun stellt sich die Frage, wie ich es am besten (und saubersten) objektorientiert implementiere. In wxWidgets oder MFC z.B. löste man das mit hässlichen Makros in Eventmaps, was ich eben nicht machen möchte. Ich will eine flexible, unabhängige und moderne Eventklasse. Bisher habe ich folgenden Lösungsansatz realisiert, was auch wunderbar klappt:</p>
<pre><code class="language-cpp">class KeyEventHandler
{
	private:
		// Zeiger, der auf die Funktion zeigt, die bei einem Event aufgerufen wird.
		void *HandleFunc;

	protected:
		// Speichert den Eventkey.
		char EventKey;

	public:
		void AddEventHandler (void HandleFunc ());
		void StartEventMonitor (char EventKey);
		void StopEventMonitor ();
		void RemoveEventHandler ();
};
</code></pre>
<pre><code class="language-cpp">#include &quot;KeyEvent.h&quot;

void KeyEventHandler :: AddEventHandler (void (*HandleFunc) ())
{
          // Funktionsadresse in Zeiger speichern, um sie dann später
          // aufrufen zu können.
	(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);
}

void KeyEventHandler :: RemoveEventHandler ()
{
	HandleFunc = NULL;
}

void KeyEventHandler :: StartEventMonitor (char EventKey)
{
          // Wenn GedrückteTaste == EventKey, dann rufe die Funktion auf:
	(static_cast&lt;void (*)()&gt;(HandleFunc))(); 
}

void KeyEventHandler :: StopEventMonitor ()
{
}
</code></pre>
<p>Von dieser Klasse werden dann beliebige Klassen abgeleitet, denen man den Eventhandle zuordnen kann. Wie man sieht, arbeite ich hier mit simplen Funktionszeigern. Ist das ein guter Lösungsweg? Wie haben das andere, moderne C++ Libraries implementiert? Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/192509/wie-am-besten-eine-eventklasse-implementieren</link><generator>RSS for Node</generator><lastBuildDate>Sun, 27 Sep 2026 10:28:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/192509.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Sep 2007 11:42:07 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 11:42:07 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte in meinem Programm Keyevents in einer eigenen Klasse behandeln. Das ganze läuft nach dem &quot;Gedrückt wenn...&quot; Prinzip ab, sobald also eine bestimmte Taste gedrückt wurde, wird das Event ausgelöst, und eine zugeordnete Funktion aufgerufen, die dann das Event behandelt. Nun stellt sich die Frage, wie ich es am besten (und saubersten) objektorientiert implementiere. In wxWidgets oder MFC z.B. löste man das mit hässlichen Makros in Eventmaps, was ich eben nicht machen möchte. Ich will eine flexible, unabhängige und moderne Eventklasse. Bisher habe ich folgenden Lösungsansatz realisiert, was auch wunderbar klappt:</p>
<pre><code class="language-cpp">class KeyEventHandler
{
	private:
		// Zeiger, der auf die Funktion zeigt, die bei einem Event aufgerufen wird.
		void *HandleFunc;

	protected:
		// Speichert den Eventkey.
		char EventKey;

	public:
		void AddEventHandler (void HandleFunc ());
		void StartEventMonitor (char EventKey);
		void StopEventMonitor ();
		void RemoveEventHandler ();
};
</code></pre>
<pre><code class="language-cpp">#include &quot;KeyEvent.h&quot;

void KeyEventHandler :: AddEventHandler (void (*HandleFunc) ())
{
          // Funktionsadresse in Zeiger speichern, um sie dann später
          // aufrufen zu können.
	(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);
}

void KeyEventHandler :: RemoveEventHandler ()
{
	HandleFunc = NULL;
}

void KeyEventHandler :: StartEventMonitor (char EventKey)
{
          // Wenn GedrückteTaste == EventKey, dann rufe die Funktion auf:
	(static_cast&lt;void (*)()&gt;(HandleFunc))(); 
}

void KeyEventHandler :: StopEventMonitor ()
{
}
</code></pre>
<p>Von dieser Klasse werden dann beliebige Klassen abgeleitet, denen man den Eventhandle zuordnen kann. Wie man sieht, arbeite ich hier mit simplen Funktionszeigern. Ist das ein guter Lösungsweg? Wie haben das andere, moderne C++ Libraries implementiert? Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365818</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 11:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 11:50:40 GMT]]></title><description><![CDATA[<p>In Java macht man sowas meistens mit Interfaces und <a href="http://en.wikipedia.org/wiki/Observer_pattern" rel="nofollow">Observer pattern</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365824</guid><dc:creator><![CDATA[the guitar on the mtv]]></dc:creator><pubDate>Sat, 15 Sep 2007 11:50:40 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 11:59:23 GMT]]></title><description><![CDATA[<p>Mit Interfaces (abstrakten Basisklassen) habe ich es auch schon probiert, das Problem ist dann aber, dass pro Klasseninstanz nur ein Eventhandle eingerichtet werden kann. Wenn ich aber mehr Events einrichten möchte, müsste ich eine neue Klasse schrieben, die dann die Methoden der Basisklasse redefiniert. Das ganze soll aber über eine Klasse laufen. So sieht das aus:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt; 
#include &lt;string&gt; 

class AbstractBasis 
{ 
    public: 
        virtual void Test (const std::string &amp;text) = 0; 
}; 

class DerivedClass : public AbstractBasis 
{ 
    public: 
        void Test (const std::string &amp;text) { 
            std::cout &lt;&lt; &quot;Derived Class: &quot; &lt;&lt; text &lt;&lt; std::endl; 
        } 
}; 

class AbstractAPI 
{ 
    public: 
        void AddPlugin (DerivedClass *Handler) { 
            Handler-&gt;Test (&quot;Hallo, ich bins&quot;); 
        } 
}; 

int main () 
{ 
    DerivedClass *derive = new DerivedClass; 
    AbstractAPI api; 
    api.AddPlugin (static_cast &lt;DerivedClass*&gt; (derive)); 
    std::cin.get (); 
}
</code></pre>
<p>Wenn ich nun ein zweites Plugin (Eventhandle) einrichten möchte, müsste ich eine zweite Instanz von DerivedClass erstellen, die im Endeffekt aber immernoch die selben, redefinierten Methoden der ersten Instanz enthält, da es sich im Prinzip nur um eine einzige Klasse handelt. Um eine zweite Funktion aufrufen lassen zu können, müsste ich eine zweite Klasse schreiben, die die selben Methoden der Basisklasse (AbstractBasis) in der Neufassung redefiniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365827</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365827</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 11:59:23 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 12:13:15 GMT]]></title><description><![CDATA[<p>ich versteh dein Problem nicht. Wenn du willst, dass zwei Methoden von deiner Klasse bei einem Event aufgerufen werden, dann ruf die halt in deiner &quot;HandleEvent&quot; Methode auf. Oder was meinst du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365833</guid><dc:creator><![CDATA[the guitar on the mtv]]></dc:creator><pubDate>Sat, 15 Sep 2007 12:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 12:19:16 GMT]]></title><description><![CDATA[<p>Ich hab sowas noch nicht implementiert (werd es aber auch bald brauchen ;)). Du solltest Erstens /auf gar keinen Fall/ einen Funktionszeiger in einem normalen Zeiger speichern. Das ist sehr fahrlässig, da meines Erachtens nirgendwo steht, dass Funktionszeiger und Datenzeiger die gleiche Größe haben.<br />
Besser wäre es, du würdest einen Funktionswrapper wie Boost.Function oder std::tr1::function (ist dasselbe, aber letzteres ist zb beim GCC4 dabei während du für Ersteres Boost oder Teile davon installieren musst.<br />
Noch besser wäre es, wenn du etwas wie Boost.Signals verwenden würdest. Damit kannst du an ein Ereignis mehrere Handler hängen.</p>
<p>Was sind eigentlich die Voraussetzungen? Wenn zB alle Ereignisse bereits zur Compilezeit bekannt sind, dann solltest du möglicherweise Abstand von Laufzeitpolymorphie nehmen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365835</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365835</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 15 Sep 2007 12:19:16 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 12:24:04 GMT]]></title><description><![CDATA[<p>das &quot;(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);&quot; ist böse, weil das verhalten undefiniert ist.<br />
definiere dir lieber per typedef ein passenden funktion oder definiere in KeyEventHandler HandleFunc genauso wie bei der parameterübergabe.</p>
<p>ansonste eleganter ist wohl eine klasse zu schreiben, in der die funktion über eine definierte schnittstelle aufgerufen wird oder halt einen functor zu übergeben.</p>
<p>achja: den sinn dieser zeile</p>
<pre><code class="language-cpp">api.AddPlugin (static_cast &lt;DerivedClass*&gt; (derive));
</code></pre>
<p>ist mir völlig schleierhaft. derive ist von typ DerivedClass*, da musst du nichts casten.</p>
<p>zum eigentliche thema: elegant finde ich persönlich die verwendung signal-slot zum handling von events, da man sich den spaß mit den funktionspointern spart.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365837</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365837</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 15 Sep 2007 12:24:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 12:25:27 GMT]]></title><description><![CDATA[<p>Nein, das meinte ich nicht. Ich möchte mehrere Eventhandles einrichten können, also z.B. wenn Taste 'a' gedrückt wird, soll eine bestimmte Funktion aufgerufen werden. Gleichzeitig soll aber auch Taste 'y' überwacht werden, der dann wiederrum eine eigene, aufzurufende Funktion zugeordnet wird. Das klappt in der ersten Lösung mit den Funktionszeigern auch ganz gut, ich könnte in ein Array jede einzelne Adresse der aufzurufenden Funktionen abspeichern, das gleiche ebenfalls mit den Eventkeys (Tasten), die dann alle parallel überwacht werden.</p>
<p>Mit dem Interface jedoch bereitet es mir Schwierigkeiten. Ich habe nur eine von der Basisklasse abgeleitete Klasse (DerivedClass), die die Methoden redefiniert, die später von AbstractAPI aufgerufen werden können. Und jetzt stell dir vor, ich möchte nun mehrere Eventhandles einrichten, es steht mir aber nur eine abgeleitete Klasse zur Verfügung, die die Methoden auch nur einmal redefiniert. Deshalb kann ich letztendlich für jede zu überwachende Taste nur diese einzige Methode aufrufen, für jede weitere müsste ich wieder eine neue, von der Basisklasse abgeleitete Klasse schreiben, um die Neuversion der Methoden zu redefinieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365838</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365838</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 12:25:27 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 12:32:00 GMT]]></title><description><![CDATA[<p>.filmor schrieb:</p>
<blockquote>
<p>Was sind eigentlich die Voraussetzungen? Wenn zB alle Ereignisse bereits zur Compilezeit bekannt sind, dann solltest du möglicherweise Abstand von Laufzeitpolymorphie nehmen.</p>
</blockquote>
<p>Die Ereignisse sind natürlich nicht zur Compilezeit bekannt, der Compiler kann ja nicht wissen, wann ich welche Tasten drücken werde. Abgefragt wird der Eingabebuffer mit der WinAPI Funktion GetAsyncKeyState ().</p>
<p>ghorst schrieb:</p>
<blockquote>
<p>das &quot;(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);&quot; ist böse, weil das verhalten undefiniert ist.</p>
</blockquote>
<p>Deshalb suche ich ja eine bessere Lösung.</p>
<p>ghorst schrieb:</p>
<blockquote>
<p>ansonste eleganter ist wohl eine klasse zu schreiben, in der die funktion über eine definierte schnittstelle aufgerufen wird oder halt einen functor zu übergeben.</p>
</blockquote>
<p>Klingt gut, könntest du mir das detaillierter erklären?</p>
<p>ghorst schrieb:</p>
<blockquote>
<p>ist mir völlig schleierhaft. derive ist von typ DerivedClass*, da musst du nichts casten.</p>
</blockquote>
<p>Da gebe ich dir Recht, das war noch ein Anfangsfehler, den ich nicht beseitigt habe.</p>
<p>ghorst schrieb:</p>
<blockquote>
<p>zum eigentliche thema: elegant finde ich persönlich die verwendung signal-slot zum handling von events, da man sich den spaß mit den funktionspointern spart.</p>
</blockquote>
<p>Und was bedeutet das konkret? Hast du evtl. nen Pseudocode dafür? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>.filmor schrieb:</p>
<blockquote>
<p>Besser wäre es, du würdest einen Funktionswrapper wie Boost.Function oder std::tr1::function (ist dasselbe, aber letzteres ist zb beim GCC4 dabei während du für Ersteres Boost oder Teile davon installieren musst.</p>
</blockquote>
<p>Zwar ist Boost eine tolle Sache, aber ich will von fertigen Libraries in meinem Projekt Abstand nehmen. Gerade die Selbstimplementation ist das reizende an der ganzen Sache.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365841</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365841</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 12:32:00 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 13:55:43 GMT]]></title><description><![CDATA[<p>Hat niemand mehr was zu sagen? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365885</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365885</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 13:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 15:33:14 GMT]]></title><description><![CDATA[<p>CodeOriginator schrieb:</p>
<blockquote>
<p>Nein, das meinte ich nicht. Ich möchte mehrere Eventhandles einrichten können, also z.B. wenn Taste 'a' gedrückt wird, soll eine bestimmte Funktion aufgerufen werden. Gleichzeitig soll aber auch Taste 'y' überwacht werden, der dann wiederrum eine eigene, aufzurufende Funktion zugeordnet wird. Das klappt in der ersten Lösung mit den Funktionszeigern auch ganz gut, ich könnte in ein Array jede einzelne Adresse der aufzurufenden Funktionen abspeichern, das gleiche ebenfalls mit den Eventkeys (Tasten), die dann alle parallel überwacht werden.</p>
</blockquote>
<p>Und wenn du alle Tastenevents haben willst, dann musst du ganz viele Funktionen registrieren. Alle solchen Eventhandler/Callbackfunktionen die ich bisher gesehen hab, haben es anderst gemacht. Die haben immer den KeyCode mitgegeben.<br />
Außerdem wäre es ja auch nicht so schlimm, mehrere Implementierungen für das Interface zu haben, wenn du bei deiner Vorgehensweise bleiben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365948</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365948</guid><dc:creator><![CDATA[the guitar on the mtv]]></dc:creator><pubDate>Sat, 15 Sep 2007 15:33:14 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 15:42:55 GMT]]></title><description><![CDATA[<blockquote>
<p>Außerdem wäre es ja auch nicht so schlimm, mehrere Implementierungen für das Interface zu haben, wenn du bei deiner Vorgehensweise bleiben willst.</p>
</blockquote>
<p>Die Sache ist ja die, ich suche nach einer optimaleren Lösung. Das mit dem Interface hat (in meiner Version) eben den Nachteil, dass ich die Basisklassenmethoden pro abgeleiteter Klasse nur einmal redefinieren kann. Ich könnte wenigstens noch der bei einem auftretenden Event aufgerufenen Funktion die eben gedrückte Taste per Parameter übergeben, und innerhalb der Funktion mittels switch/case Konstrukten für jeden erwünschten Buchstaben reagieren. Etwa so:</p>
<pre><code class="language-cpp">void EventFunktion (char *GedrueckteTaste)
{
    case 'A':
        // ...
    break;
    // usw...
}
</code></pre>
<p>Wenn mir aber trotzdem noch jemand ein konkretes Codebeispiel liefern könnte (-&gt; ghorst!), dann wäre ich sehr erfreut darüber.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1365957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1365957</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sat, 15 Sep 2007 15:42:55 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 17:43:20 GMT]]></title><description><![CDATA[<p>CodeOriginator schrieb:</p>
<blockquote>
<p>Zwar ist Boost eine tolle Sache, aber ich will von fertigen Libraries in meinem Projekt Abstand nehmen. Gerade die Selbstimplementation ist das reizende an der ganzen Sache.</p>
</blockquote>
<p>Boost ist in großen Teilen ziemlich „low level“. Du bekommst dort mit Sicherheit keine fertige Lösung für dein Problem. Aber Boost.Function (oder auch std(!)::tr1::function) solltest du auf jeden Fall verwenden. Du schränkst dich mit dem Alles-selbst-implementieren zu sehr ein (die stdlib willst du ja auch nicht selbst bauen, hoffe ich zumindest).<br />
Du kannst ja auf dessen Basis etwas Boost.Signals-mäßiges bauen.</p>
<p>CodeOriginator schrieb:</p>
<blockquote>
<p>.filmor schrieb:</p>
<blockquote>
<p>Was sind eigentlich die Voraussetzungen? Wenn zB alle Ereignisse bereits zur Compilezeit bekannt sind, dann solltest du möglicherweise Abstand von Laufzeitpolymorphie nehmen.</p>
</blockquote>
<p>Die Ereignisse sind natürlich nicht zur Compilezeit bekannt, der Compiler kann ja nicht wissen, wann ich welche Tasten drücken werde. Abgefragt wird der Eingabebuffer mit der WinAPI Funktion GetAsyncKeyState ().</p>
</blockquote>
<p>Natürlich weiß er nicht, welche Tasten du /drückst/, aber er weiß, welche gedrückt werden /können/.</p>
<p>CodeOriginator schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>das &quot;(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);&quot; ist böse, weil das verhalten undefiniert ist.</p>
</blockquote>
<p>Deshalb suche ich ja eine bessere Lösung.</p>
</blockquote>
<p>Entweder Boost.Function oder per Template.</p>
<p>CodeOriginator schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>ansonste eleganter ist wohl eine klasse zu schreiben, in der die funktion über eine definierte schnittstelle aufgerufen wird oder halt einen functor zu übergeben.</p>
</blockquote>
<p>Klingt gut, könntest du mir das detaillierter erklären?</p>
</blockquote>
<p>Bist du dir sicher, dass du schon sicher genug in der Sprache bist?</p>
<p>CodeOriginator schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>zum eigentliche thema: elegant finde ich persönlich die verwendung signal-slot zum handling von events, da man sich den spaß mit den funktionspointern spart.</p>
</blockquote>
<p>Und was bedeutet das konkret? Hast du evtl. nen Pseudocode dafür? <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
</blockquote>
<p>Boost.Signals oder libsigc++. Letztlich ist das nichts anderes, als ein noch weiter als Boost.Function verallgemeinerter Funktionszeiger, der beliebig viele aufzurufende Funktionen hat. Etwas in der Art</p>
<pre><code class="language-cpp">slot s;
s.add (funktion1);
s.add (funktion2);
s (); // funktion1 und funktion2 werden nacheinander aufgerufen, das wäre der callback
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1366028</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366028</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Sat, 15 Sep 2007 17:43:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 19:30:52 GMT]]></title><description><![CDATA[<p>Wie .filmor bereits angesprochen hat, währe ne Templateklasse eine Lösung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366072</guid><dc:creator><![CDATA[mikey]]></dc:creator><pubDate>Sat, 15 Sep 2007 19:30:52 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sat, 15 Sep 2007 22:44:38 GMT]]></title><description><![CDATA[<p>CodeOriginator schrieb:</p>
<blockquote>
<p>ghorst schrieb:</p>
<blockquote>
<p>das &quot;(*this).HandleFunc = static_cast &lt;void*&gt; (HandleFunc);&quot; ist böse, weil das verhalten undefiniert ist.</p>
</blockquote>
<p>Deshalb suche ich ja eine bessere Lösung.</p>
</blockquote>
<p>ich denk, du hast mich falsch verstanden: deine &quot;lösung&quot; ist schlicht falsch, weil sie der standard verbietet.<br />
den passenden link hat bspw finix <a href="http://www.c-plusplus.net/forum/viewtopic-var-p-is-1365684.html#1365684" rel="nofollow">hier</a> geliefert.</p>
<p>CodeOriginator schrieb:</p>
<blockquote>
<p>Klingt gut, könntest du mir das detaillierter erklären?</p>
</blockquote>
<p>definierte schnittsetelle heißt, basisklasse definieren und darin eine virtual funktion einsetzen, die man dann bspw in dem eventhandler aufruft. functor heißt, den operator() überladen.</p>
<p>ansonsten hat .filmor alles wichtige gesagt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366121</guid><dc:creator><![CDATA[ghorst]]></dc:creator><pubDate>Sat, 15 Sep 2007 22:44:38 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sun, 16 Sep 2007 09:15:43 GMT]]></title><description><![CDATA[<p>verschick event objekte, die informationen darüber mit sich tragen, was für ein event eingetreten ist. beispiel:</p>
<pre><code class="language-cpp">struct KeyPressedEvent
{
  int key;
};

class KeyListener
{
  public:
    virtual void keyPressed(const KeyPressedEvent &amp;event) = 0;
};
</code></pre>
<p>so sind die key events erstmal neutral, sie machen nichts weiter, als informationen darüber zu enthalten, dass eine taste gedrückt wurde und welche taste gedrückt wurde. den listener steht es frei, die gedrückten tasten zu interpretieren, wie es nötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366187</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366187</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Sun, 16 Sep 2007 09:15:43 GMT</pubDate></item><item><title><![CDATA[Reply to Wie am besten eine Eventklasse implementieren? on Sun, 16 Sep 2007 10:18:45 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>verschick event objekte, die informationen darüber mit sich tragen, was für ein event eingetreten ist. beispiel:</p>
</blockquote>
<p>Danke, genau so habe ich es geregelt. Also wenn jeder meint, dass die Lösung mit dem Interface eine gute Lösung ist, dann lasse ich das mal so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1366217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1366217</guid><dc:creator><![CDATA[CodeOriginator]]></dc:creator><pubDate>Sun, 16 Sep 2007 10:18:45 GMT</pubDate></item></channel></rss>