<?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[Probleme mit einem Event-Manager]]></title><description><![CDATA[<pre><code class="language-cpp">class EventManager : public IUnknown
{
private:
	/// \brief Constructor
	EventManager();

public:	
	/// \brief Deconstructor
	virtual ~EventManager();

	/// \brief Accessor for the Singleton.
	static EventManager&amp; getInstance();

	/** \brief Registers a new Event
	  * \param id The Event-ID to Register.  
	  */ 
	void registerEvent(const int id);

	/** \brief Registers a new Receiver of an Event
	  * \param event A reference to an event.
	  */ 
	void registerReceiver(const Event&amp; event);

	/** \brief Unregisters a complete Event-ID
	  * \param id The ID to remove.
	  */ 
	void unregisterEvent(const int id);

	/** \brief Unregisters the Receiver of an Event.
	  * \param event A reference to an Object of Event.
	  */
	void unregisterReceiver(const Event&amp; event);

	/** \brief Notifies the Manager, that an Event wants to be fired.
	  * \param id The Event-Id.  
	  */
	void notify(const int id);	

private:
	// Initial List
	std::list&lt; std::list&lt;Event&gt; &gt; m_eventList;

	// No copy
	EventManager(const EventManager&amp;) {}
	EventManager&amp; operator=(const EventManager&amp;) { return *this; }
};
</code></pre>
<p>Das ist jetzt mal meine Vorstellung eines simplen Event-Managers.<br />
Die Idee dahinter:<br />
Jede Klasse kann ein Event anmelden und jede Klasse kann sich als Empfänger für eine Event-ID anmelden. Wenn jetzt eine ID noch nicht eingetragen ist, wird eine neue Liste dafür angelegt. So hat quasi das Event ID_FOOBAR eine eigene Receiver-Liste und das Event ID_MYEVENT genauso. Sollte Zeit sparen beim suchen der Empfänger.<br />
Die Klasse Event enthält eine virtuelle Funktion die von einem Empfänger überschrieben werden muss, um das Event zu erhalten. (virtual void onEvent();)</p>
<pre><code class="language-cpp">class RPGLIB_CALL Event : public rpgLib::IUnknown
{
public:
	/// \brief Constructor
	Event();

	/** \brief Constructor
	  * \param id The id to use. -1 indicates an invalid id.
	  */  	
	Event(const int id = -1);

	/// \brief Deconstructor
	virtual ~Event();

	/// \brief Executes the Event.
	virtual void onEvent(){}

	/// \brief Returns the ID of the Event.
	const int&amp; getEventId() const;

	/** \brief Sets the Events ID.
	  * \param id The id to use. -1 indicates an invalid id.
	  */
	void setEventId(const int id);

protected:
	int m_id;
};
</code></pre>
<p>Jetzt komm ich nur in Schwierigkeiten dabei. Und zwar die Übergabedaten. Erst dachte ich daran, die Klasse Event als Template zu realisieren (Unbekannt wäre T für die Daten), aber da hab ich wieder das Problem, dass ich sie dann nicht als Parameter verwenden kann, ohne den EventManager auch als Template einzubauen.</p>
<pre><code class="language-cpp">template&lt;classname T&gt;
class Event : public IUnknown
{
public:
	/// \brief Constructor
	Event();

	/** \brief Constructor
	  * \param id The id to use. -1 indicates an invalid id.
	  */  	
	Event(const int id = -1);

	/// \brief Deconstructor
	virtual ~Event();

	/// \brief Executes the Event.
	virtual void onEvent(const T&amp; data){}

	/// \brief Returns the ID of the Event.
	const int&amp; getEventId() const;

	/** \brief Sets the Events ID.
	  * \param id The id to use. -1 indicates an invalid id.
	  */
	void setEventId(const int id);        

protected:
	int m_id;
        T m_data;
};
</code></pre>
<p>Und das ist ja nicht der Sinn der ganzen Geschichte.<br />
Vllt geh ich ja auch komplett falsch ran, aber ich möchte das ganze so einfach wie möglich halten und ohne Boost::Signals... wenn möglich.<br />
Jemand eine Idee?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/201533/probleme-mit-einem-event-manager</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 06:54:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201533.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 31 Dec 2007 13:46:15 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Probleme mit einem Event-Manager on Mon, 31 Dec 2007 13:46:15 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class EventManager : public IUnknown
{
private:
	/// \brief Constructor
	EventManager();

public:	
	/// \brief Deconstructor
	virtual ~EventManager();

	/// \brief Accessor for the Singleton.
	static EventManager&amp; getInstance();

	/** \brief Registers a new Event
	  * \param id The Event-ID to Register.  
	  */ 
	void registerEvent(const int id);

	/** \brief Registers a new Receiver of an Event
	  * \param event A reference to an event.
	  */ 
	void registerReceiver(const Event&amp; event);

	/** \brief Unregisters a complete Event-ID
	  * \param id The ID to remove.
	  */ 
	void unregisterEvent(const int id);

	/** \brief Unregisters the Receiver of an Event.
	  * \param event A reference to an Object of Event.
	  */
	void unregisterReceiver(const Event&amp; event);

	/** \brief Notifies the Manager, that an Event wants to be fired.
	  * \param id The Event-Id.  
	  */
	void notify(const int id);	

private:
	// Initial List
	std::list&lt; std::list&lt;Event&gt; &gt; m_eventList;

	// No copy
	EventManager(const EventManager&amp;) {}
	EventManager&amp; operator=(const EventManager&amp;) { return *this; }
};
</code></pre>
<p>Das ist jetzt mal meine Vorstellung eines simplen Event-Managers.<br />
Die Idee dahinter:<br />
Jede Klasse kann ein Event anmelden und jede Klasse kann sich als Empfänger für eine Event-ID anmelden. Wenn jetzt eine ID noch nicht eingetragen ist, wird eine neue Liste dafür angelegt. So hat quasi das Event ID_FOOBAR eine eigene Receiver-Liste und das Event ID_MYEVENT genauso. Sollte Zeit sparen beim suchen der Empfänger.<br />
Die Klasse Event enthält eine virtuelle Funktion die von einem Empfänger überschrieben werden muss, um das Event zu erhalten. (virtual void onEvent();)</p>
<pre><code class="language-cpp">class RPGLIB_CALL Event : public rpgLib::IUnknown
{
public:
	/// \brief Constructor
	Event();

	/** \brief Constructor
	  * \param id The id to use. -1 indicates an invalid id.
	  */  	
	Event(const int id = -1);

	/// \brief Deconstructor
	virtual ~Event();

	/// \brief Executes the Event.
	virtual void onEvent(){}

	/// \brief Returns the ID of the Event.
	const int&amp; getEventId() const;

	/** \brief Sets the Events ID.
	  * \param id The id to use. -1 indicates an invalid id.
	  */
	void setEventId(const int id);

protected:
	int m_id;
};
</code></pre>
<p>Jetzt komm ich nur in Schwierigkeiten dabei. Und zwar die Übergabedaten. Erst dachte ich daran, die Klasse Event als Template zu realisieren (Unbekannt wäre T für die Daten), aber da hab ich wieder das Problem, dass ich sie dann nicht als Parameter verwenden kann, ohne den EventManager auch als Template einzubauen.</p>
<pre><code class="language-cpp">template&lt;classname T&gt;
class Event : public IUnknown
{
public:
	/// \brief Constructor
	Event();

	/** \brief Constructor
	  * \param id The id to use. -1 indicates an invalid id.
	  */  	
	Event(const int id = -1);

	/// \brief Deconstructor
	virtual ~Event();

	/// \brief Executes the Event.
	virtual void onEvent(const T&amp; data){}

	/// \brief Returns the ID of the Event.
	const int&amp; getEventId() const;

	/** \brief Sets the Events ID.
	  * \param id The id to use. -1 indicates an invalid id.
	  */
	void setEventId(const int id);        

protected:
	int m_id;
        T m_data;
};
</code></pre>
<p>Und das ist ja nicht der Sinn der ganzen Geschichte.<br />
Vllt geh ich ja auch komplett falsch ran, aber ich möchte das ganze so einfach wie möglich halten und ohne Boost::Signals... wenn möglich.<br />
Jemand eine Idee?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428557</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Mon, 31 Dec 2007 13:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit einem Event-Manager on Mon, 31 Dec 2007 15:58:02 GMT]]></title><description><![CDATA[<p>Wenn jedes Event von der Basisklasse 'Event' erbt, kann es doch selber die Daten verwalten: Erzeugung mittels Konstruktor und Auslesen der Parameter aus der Methoden onEvent.</p>
<p>Alternativ kannst du eine Basisklasse für die Parameter anlegen und mußt dann nur in 'onEvent' auf den speziellen Typ casten.</p>
<p>P.S. Wenn du mit Polymorphie arbeitest, mußt du Zeiger auf die Events in der Manager-Klasse verwalten: std::list&lt; std::list&lt;Event*&gt; &gt; m_eventList</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1428639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1428639</guid><dc:creator><![CDATA[Th]]></dc:creator><pubDate>Mon, 31 Dec 2007 15:58:02 GMT</pubDate></item><item><title><![CDATA[Reply to Probleme mit einem Event-Manager on Sat, 05 Jan 2008 03:54:50 GMT]]></title><description><![CDATA[<p>Danke für den Denkanstoß. Hab jetzt die Methode mit der Basisklasse genommen :).<br />
<a href="http://rpglib.googlecode.com/svn/trunk/src/EventManager.cpp" rel="nofollow">http://rpglib.googlecode.com/svn/trunk/src/EventManager.cpp</a><br />
Die Klasse Event gibts dafür nicht mehr:<br />
<a href="http://rpglib.googlecode.com/svn/trunk/include/Event.h" rel="nofollow">http://rpglib.googlecode.com/svn/trunk/include/Event.h</a></p>
<p>Dafür gibts jetzt die Klasse EventReceiver die eben das Event erhält. Der Code um ein Event anzumelden und auszühren ist relativ einfach:</p>
<pre><code class="language-cpp">// Übergabewerte für das Event
class MyEventData : public IEventData
{
public:
	MyEventData(const rpgString&amp; data) : IEventData(), m_data(data)
	{

	}

	const rpgString&amp; getData() const { return m_data; }
	void setData(const rpgString&amp; data) { m_data = data; }

private:	
	rpgString m_data;
};

// Der Empfänger
class MyEventReceiver : public EventReceiver
{
public:
	MyEventReceiver(const int id) : EventReceiver(id)
	{

	}	

	virtual void onEvent(IEventData* data)
	{
		std::cout &lt;&lt; &quot;Event fired! Data: &quot; 
				  &lt;&lt; dynamic_cast&lt;MyEventData*&gt;(data)-&gt;getData() &lt;&lt; std::endl;
	}
};

int main()
{
  MyEventReceiver *receiver = new MyEventReceiver();
  MyEventData *data = new MyEventData(&quot;Hello Event&quot;);

  // Event-ID anmelden
  EVENTMANAGER().registerEvent(rpgID_DEFAULT);

  // Event-Empfänger anmelden 
  EVENTMANAGER().registerReceiver(rpgID_DEFAULT, receiver);

  // Feuert das Event
  EVENTMANAGER().notify(rpgID_DEFAULT, data);

  delete receiver; delete data;
}
</code></pre>
<p>Wenn noch jemand Verbesserungen hat, immer her damit <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="🙂"
    /><br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1430944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1430944</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Sat, 05 Jan 2008 03:54:50 GMT</pubDate></item></channel></rss>