<?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[Frage zum EventHandler]]></title><description><![CDATA[<p>also ich wollte mal ein simplen EventHandler programmieren, also habe ich mir eine EventHandler und eine EventManagerklasse geschrieben.<br />
Hat auch alles geklappt bis ich versucht habe ein argument mitzu übergeben...</p>
<pre><code class="language-cpp">#ifndef EVENTHANDLER_H
#define EVENTHANDLER_H

#include &quot;MyList.h&quot;

typedef unsigned int Event;

class EventHandler
{
private:
	Event number;
	void (*func)(void*);
public:
	EventHandler(Event e,void (*ptfunc)(void*))
		:number(e),func(ptfunc) 
	{
	}
	Event getEvent() {return number;}
	void OnEvent(void* message) {(*func)(message);}
};

class EventManager
{
private:
	MyList&lt;EventHandler&gt; list;
public:
	bool OnEvent(Event e, void* message = NULL)
	{
		for(unsigned int i = 0; i &lt; list.get_size();i++)
		{
			if(list[i].getEvent() == e)
			{
				list[i].OnEvent(message);
				return true;
			}
		}
		return false;
	}
	void operator+=(EventHandler&amp; eh)
	{
		list.push_back(eh);
	}
};

#endif
</code></pre>
<p>Mein Code funktionniert, aber ich bin nicht zufrieden damit, da es zu kompliziert für den anwender ist wieder in den richtigen typ zurückzuwandeln.</p>
<p>Ich habe schon versucht das ganze mit templates anstelle von void zeigern hinzukriegen. Wenn ich nur einen einzigen EventHandler einrichte klappt das auch, aber nicht mehr mit dem EventManager, da alle EventHandler einen anderen Übergabewert haben können.</p>
<p>Gibt es nicht eine bessere möglichkeit den eventhandler zu implementieren?</p>
<p>ich hoffe ihr versteht was ich meine <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/222103/frage-zum-eventhandler</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 06:05:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222103.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 07 Sep 2008 22:06:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zum EventHandler on Sun, 07 Sep 2008 22:08:09 GMT]]></title><description><![CDATA[<p>also ich wollte mal ein simplen EventHandler programmieren, also habe ich mir eine EventHandler und eine EventManagerklasse geschrieben.<br />
Hat auch alles geklappt bis ich versucht habe ein argument mitzu übergeben...</p>
<pre><code class="language-cpp">#ifndef EVENTHANDLER_H
#define EVENTHANDLER_H

#include &quot;MyList.h&quot;

typedef unsigned int Event;

class EventHandler
{
private:
	Event number;
	void (*func)(void*);
public:
	EventHandler(Event e,void (*ptfunc)(void*))
		:number(e),func(ptfunc) 
	{
	}
	Event getEvent() {return number;}
	void OnEvent(void* message) {(*func)(message);}
};

class EventManager
{
private:
	MyList&lt;EventHandler&gt; list;
public:
	bool OnEvent(Event e, void* message = NULL)
	{
		for(unsigned int i = 0; i &lt; list.get_size();i++)
		{
			if(list[i].getEvent() == e)
			{
				list[i].OnEvent(message);
				return true;
			}
		}
		return false;
	}
	void operator+=(EventHandler&amp; eh)
	{
		list.push_back(eh);
	}
};

#endif
</code></pre>
<p>Mein Code funktionniert, aber ich bin nicht zufrieden damit, da es zu kompliziert für den anwender ist wieder in den richtigen typ zurückzuwandeln.</p>
<p>Ich habe schon versucht das ganze mit templates anstelle von void zeigern hinzukriegen. Wenn ich nur einen einzigen EventHandler einrichte klappt das auch, aber nicht mehr mit dem EventManager, da alle EventHandler einen anderen Übergabewert haben können.</p>
<p>Gibt es nicht eine bessere möglichkeit den eventhandler zu implementieren?</p>
<p>ich hoffe ihr versteht was ich meine <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1578302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578302</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Sun, 07 Sep 2008 22:08:09 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum EventHandler on Sun, 07 Sep 2008 23:04:44 GMT]]></title><description><![CDATA[<p>es gibt 2 ansaetze - je nachdem was man will.</p>
<ol>
<li>
<p>man verwendet richtige functors statt dummen funktionszeigern und kann so mehr infos zu einer callback speichern, zB kann beim registrieren des callbacks bereits die richtigen daten angegeben werden mit denen das callback ausgefuehrt werden soll.</p>
</li>
<li>
<p>man verwendet laufzeit polymorphie und eine abstrakte EventArgs klasse. je nach event ist es dann eine konkrete von EventArgs abgeleitete klasse. uU muss in dem callback dann ein downcast gemacht werden auf den konkreten typen - aber dank dynamic_cast ist dass dann ja auch 100% ungefaehrlich.</p>
</li>
</ol>
<p>void* sollte man in c++ nicht verwenden. sie sind nicht typensicher und das ist boese.</p>
<p>Ich wuerde dir aber generell raten das komplette design zu aendern. schau dir mal boost::signal und libsigc++ an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578318</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Sun, 07 Sep 2008 23:04:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zum EventHandler on Mon, 08 Sep 2008 17:41:42 GMT]]></title><description><![CDATA[<p>ok werde ich mir mal anschauen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1578793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1578793</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Mon, 08 Sep 2008 17:41:42 GMT</pubDate></item></channel></rss>