<?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[event klasse ohne .NET]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe in der SuFU nix herausbekommen und auch wo anderes war nix zu finden.</p>
<p>Mein Aliegen ist eine Klasse zu schreiben die ich ähnlich wie delegaten in .NET benutzen kann.<br />
Also eine Klasse die ich in einer Klasse A erstellen kann und der ich in Klasse B eine (Member-)Funktion zuweisen kann, die bei einem Ereignis in A ausgeführt werden soll. (z.B. vie Funktion meiner event-Klasse: EventHandler.exec(); )</p>
<p>Geplant hatte ich das mit einem array von Pointern auf Funktionen zu realisieren.<br />
zuerst hatte ich gedacht das wäre mit einer einfachen Variablen Parameterliste<br />
(z.B. void func(char* Arg,...) ) hab dann aber schnell gemerkt, dass es das nicht ist was ich will da ich ja die Argumente die über den char* kommen auswerten muss.<br />
Weiter gings mit einer typelist mit der ich beim instanzieren meiner Klasse die Funktions-Parameterliste darauf abgestimmt generiere. Da war von vorn herein das Problem, dass ich zwar schon länger Programmiere aber erst vor kurzem zu C++ kam und auch in der Meta-Programmierung noch einige unerforrschte gefilde liegen.</p>
<p>Viel Text... mit folgenden Antworten wäre ich zufrieden: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
- Ja richtiger ansatz, aber [...]<br />
- Nein völlig falsch, besser [...]<br />
- hör lieber auf und beschäftige dich mit was anderem weil [...]</p>
<p>Dürfen aber auch anders geartet sein <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="🙂"
    /> vielen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/262196/event-klasse-ohne-net</link><generator>RSS for Node</generator><lastBuildDate>Sun, 06 Sep 2026 17:03:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/262196.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 02 Mar 2010 14:13:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 14:13:43 GMT]]></title><description><![CDATA[<p>Hallo,<br />
Ich habe in der SuFU nix herausbekommen und auch wo anderes war nix zu finden.</p>
<p>Mein Aliegen ist eine Klasse zu schreiben die ich ähnlich wie delegaten in .NET benutzen kann.<br />
Also eine Klasse die ich in einer Klasse A erstellen kann und der ich in Klasse B eine (Member-)Funktion zuweisen kann, die bei einem Ereignis in A ausgeführt werden soll. (z.B. vie Funktion meiner event-Klasse: EventHandler.exec(); )</p>
<p>Geplant hatte ich das mit einem array von Pointern auf Funktionen zu realisieren.<br />
zuerst hatte ich gedacht das wäre mit einer einfachen Variablen Parameterliste<br />
(z.B. void func(char* Arg,...) ) hab dann aber schnell gemerkt, dass es das nicht ist was ich will da ich ja die Argumente die über den char* kommen auswerten muss.<br />
Weiter gings mit einer typelist mit der ich beim instanzieren meiner Klasse die Funktions-Parameterliste darauf abgestimmt generiere. Da war von vorn herein das Problem, dass ich zwar schon länger Programmiere aber erst vor kurzem zu C++ kam und auch in der Meta-Programmierung noch einige unerforrschte gefilde liegen.</p>
<p>Viel Text... mit folgenden Antworten wäre ich zufrieden: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
- Ja richtiger ansatz, aber [...]<br />
- Nein völlig falsch, besser [...]<br />
- hör lieber auf und beschäftige dich mit was anderem weil [...]</p>
<p>Dürfen aber auch anders geartet sein <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="🙂"
    /> vielen Dank schon mal.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863316</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863316</guid><dc:creator><![CDATA[Wh0p]]></dc:creator><pubDate>Tue, 02 Mar 2010 14:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 14:23:17 GMT]]></title><description><![CDATA[<p>Schau dir mal <a href="http://www.boost.org/doc/libs/1_42_0/doc/html/function.html" rel="nofollow">boost.function</a> an.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863319</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863319</guid><dc:creator><![CDATA[evilissimo]]></dc:creator><pubDate>Tue, 02 Mar 2010 14:23:17 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 15:06:40 GMT]]></title><description><![CDATA[<p>wenns dir nicht ums programmieren, sondern bnutzen solch eines Eventsystems geht, dann kannst du auch einfach boost.signals2 nutzen. Oder dir auch anschauen, wie es dort gelöst wurde</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863351</guid><dc:creator><![CDATA[Maxi]]></dc:creator><pubDate>Tue, 02 Mar 2010 15:06:40 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 20:22:48 GMT]]></title><description><![CDATA[<p>Vielen Dank</p>
<p>Damit hat sich auch wahrscheinlich die Frage erübrigt, ob dass nicht auch für beliebig viele parameter geht.</p>
<p>Aber da ich es noch nicht wirklich verstanden habe was die genau da treiben und ich nichts gerne benutz von dem ich nicht genau weiß wie es geht mach ich mich jetzt auch daran es so gut es geht zu verstehen.<br />
Wer meint er weiß es und will darüberhinaus auch noch mir dabei helfen dem sag ich nicht nein <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>€:<br />
ich war wohl zu vorschnell:<br />
Ich will ja nicht nur diesen Pointer auf die Funktion, sondern ich will eine Klasse die mehrere solcher Pointer besitzt und auf wunsch dann ausführt.<br />
So weit ich das jetzt geplant habe gebe ich meiner Klasse, die die Funktionspointer sammelt, beim instanzieren eine typelist mit.</p>
<p>Ich kann zwar die Länge und die Typen der typelist auslesen, bei der Deklaration des arrays seh ich allerdings noch das Problem, dass die länge der typelist, die ich übergebe variieren kann.</p>
<p>Beispiel:<br />
Setze ich das maximum der Parameter für meine funktionen auf 5 übergebe dann aber nur eine typelist mit 3 Werten wirft die typelist einen error beim 4 parameter, dass dieser nicht vorhanden sei.<br />
Dummy-Parameter will ich aber nicht übergeben.</p>
<p>So sieht die typelist aus falls das nötig ist</p>
<pre><code class="language-cpp">#pragma once

struct Nil {};

// default Typelist
template &lt; typename H = Nil, typename T=Nil &gt;
struct TypeList;

template &lt; typename H, typename T &gt;
struct TypeList {
	typedef H	Head;
	typedef T	Tail;
};

// returns number of Elements in the TypeList
template &lt; class List &gt;
struct size {
	enum { result = 1 + size&lt; typename List::Tail &gt;::result };
};
template &lt;&gt;
struct size&lt;Nil&gt; {
	enum { result = 0 };
};

// returns the Type-Element with the passed index
template &lt; 
	class List, 
	int index, 
	int step = 0, 
	bool stop = ( index==step ), 
	bool OutOfRange = ( size&lt; typename List &gt;::result == 0 ) 
&gt;
struct get {
	typedef typename get&lt; List, step+1 &gt;::result result;
};
// OutOfRange-Exeption of get
template &lt; 
	class List, 
	int index, 
	int step, 
	bool stop
&gt;
struct get &lt; List, index, step, stop, true &gt; {};
// Element found of get
template &lt; 
	class List, 
	int index, 
	int step, 
	bool OutOfRange
&gt;
struct get &lt; List, index, step, true, OutOfRange &gt; {
	typedef typename List::Head result;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863481</guid><dc:creator><![CDATA[Wh0p]]></dc:creator><pubDate>Tue, 02 Mar 2010 20:22:48 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 20:22:30 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht ganz, warum du nicht boost::function benutzt. Das ist so, wie ich das sehe genau das, was du haben möchtest und da kannst du ja auch beliebig viele Parameter angeben. Wenn du wissen willst, wie die gebaut ist, dann kannst du dir die Implementierung ja anschauen. Prinzipiell ist es ja nur ein eleganter Wrapper für Funktionszeiger. Habe letztens sogar hier im Forum mal was rumschwirren sehen, was das Prinzip erklärt hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863510</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863510</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Mar 2010 20:22:30 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 21:00:44 GMT]]></title><description><![CDATA[<p>OK, dann lag das daran dass ich mich nicht richtig ausgedrückt habe...<br />
Mir reichen eben nicht nur das was boost::function mir liefert um nochmal deutlicher auf meine vorstellung einzugehen:</p>
<pre><code>class A
{
    int x;
    eventklasse e;
    ...
    A() { e = new eventklasse(/* Übergabe von welcher &quot;Art&quot; der event sein soll */) }
    ...
    void mach_was(){
        x--;
        e.execute();
    }
}

class B
{
    ...
    B(A&amp; a) {
        a.e.neuerevent(&amp;B::reagiere_auf_A)
    }
    ...
    void reagiere_auf_A() {
        cout &lt;&lt; &quot;A hat was getan&quot; &lt;&lt; endl;
    }
}

class eventklasse // &quot;Art&quot; der Funktionen muss angeben 
{                 // ich dachte daran Return-Typ und Parameter via typelist zu übergeben

    // datentyp indem ich Pointer auf Funktionen oder so etwas ähnliches speichern kann
    ...
    neuerevent(/* Pointer auf eine Funktion von gleicher &quot;Art&quot; wie der obige Datentyp */) {
    ...}
    execute() {
        // alle Gespeicherten Funktionen ausführen
    }
}
</code></pre>
<p>vllt ist jetzt mein problem klarer dargelegt...es geht nicht darum die Pointer oder was auch immer zu erstellen.<br />
Auch bei boost::function muss ich doch die typnamen angeben. und gerade die sind in meiner typelist welche durchaus unterschiedliche Längen aufweisen kann.<br />
will ich in meiner eventklasse aber ein array von boost::function erstellen muss ich direkt mit angeben mit welchen Parametern die Funktion ausgerüstet werden soll. Ich kann doch nicht einfach boost::function&lt;...&gt; aufrufen wenn ich gar nicht weiß ob alle parameter die ich übergebe in der typelist stecken, die könnte ja mal mehr mal weniger Elemente besitzen.</p>
<p>Oder habe ich etwas grundsätzliches an boost::function nicht verstanden und das was ich will lässt sich auch damit bewerkstalligen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863521</guid><dc:creator><![CDATA[Wh0p]]></dc:creator><pubDate>Tue, 02 Mar 2010 21:00:44 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 21:19:10 GMT]]></title><description><![CDATA[<p>Hmm.<br />
Ich bin mir bei deinem Code nicht ganz sicher, was du willst, aber ich probiers mal anderst.</p>
<p>Du willst ja auf verschiedene Arten von Events reagieren, wie z.B <code>MouseEvent</code> oder <code>KeyBoardEvent</code> . Und da willst du jetzt eine Reihe von Funktionen, welche aufgerufen werden, wenn sein solches Ereigniss passiert. Spätestens beim Aufruf der Funktion musst du aber deren Signatur wissen (naja zumindest die obligatorischen Parameter). Also muss jede Funktion, welche sich für ein Event registiert die gleiche Schnittstelle anbieten, damit überhaupt ein generelles aufrufen passieren kann. Also folgt daraus, dass jeder Event seine eigene Liste mit Funktionen hat, wo du weiss, was es für eine Signatur hat.</p>
<p>(pseudecode, habe auch C++0x - for Variante benutzt)</p>
<pre><code class="language-cpp">class MouseEvent
{
  typedef boost::function&lt;void(int x, int y)&gt; function_type;
  public:
    void register (function_type f){ functions.push_back ( f ); }
    void notify () const { for(function_type f: functions_) f (0,0/*x und y position*/); }

  private:
    std::list&lt;function_type&gt; functions_;
};

class KeyboardEvent
{
 typedef boost::function&lt;void(int key)&gt; function_type;

 public:
   void register (function_type f){ functions.push_back ( f ); }
   void notify () const { for(function_type f: functions_) f (0/*key_type*/); }

 private:
   std::list&lt;function_type&gt; functions_;
};
</code></pre>
<p>So in etwa stelle ich mir das vor. Vielleicht verstehe ich dich aber auch nur falsch. Kannst ja mal sagen, was du hier noch anderst haben willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863529</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Mar 2010 21:19:10 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 21:44:58 GMT]]></title><description><![CDATA[<p>Du verstehst mich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Das hats im Kern getroffen. Was ich daran ändern würde/wollte, ist dass ich den funktions-Typ auch von außen bzw beim instanzieren der Klasse bestimmen kann, so dass ich das Ganze etwas allgemeiner aufsetzen kann... aber das bekomm ich vllt auch alleine hin bekommen.</p>
<p>Ich wundere mich immer wieder wie einfach doch die Lösung sein kann...<br />
(immerhin hab ich jetzt Unmengen an template/Meta-Programmierungs Literatur intus was ja auch nicht schaden kann <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>Vielen Dank</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863550</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863550</guid><dc:creator><![CDATA[Wh0p]]></dc:creator><pubDate>Tue, 02 Mar 2010 21:44:58 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Tue, 02 Mar 2010 22:06:44 GMT]]></title><description><![CDATA[<p>Klar. Da kann man sehr viel noch dran ändern. Habe es so einfach, wie möglich gemacht.</p>
<p>Ich denke, dass man das da auch noch wirklich so weiterspinnen kann, dass man am Ende so, wie du das willst eine Typliste angeben kannst und dann sozusagen dein neues Event hast und der Compiler dir dann die Klassen erzeugt, aber das überlasse ich jetzt mal dir, wenn du magst. <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/1863552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863552</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 02 Mar 2010 22:06:44 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Wed, 03 Mar 2010 16:20:31 GMT]]></title><description><![CDATA[<p>Eine Sache bekomm ich nach wie vor nicht gebacken:</p>
<p>die Methode notify hätte ich gerne mit der selben Parameter Liste wie die, die ich per typedef erstellt habe.</p>
<p>ich will das in elegant:</p>
<pre><code class="language-cpp">template &lt; typename ft &gt;
class EventX
{
  typedef ft function_type;

  public:
	void add (function_type f){ functions_.push_back ( f ); }

	void notify () const { 
		for(int i=functions_.size()-1; i&gt;-1; --i) 
			functions_[i] (); 
	}
	template &lt; typename T1 &gt;
	void notify ( T1 p1) const { 
		for(int i=functions_.size()-1; i&gt;-1; --i) 
			functions_[i] ( p1 ); 
	}
	template &lt; typename T1, typename T2 &gt;
	void notify ( T1 p1, T2 p2) const { 
		for(int i=functions_.size()-1; i&gt;-1; --i) 
			functions_[i] ( p1, p2 ); 
	}

        // usw. 
        // ob es nicht irgendwie besser geht, dass notify die selbe Parameterliste bekommt, wie sie in funktion_type vorhanden ist

  private:
    std::vector&lt;function_type&gt; functions_;

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1863895</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863895</guid><dc:creator><![CDATA[Wh0p]]></dc:creator><pubDate>Wed, 03 Mar 2010 16:20:31 GMT</pubDate></item><item><title><![CDATA[Reply to event klasse ohne .NET on Wed, 03 Mar 2010 20:53:59 GMT]]></title><description><![CDATA[<p>Hmm. Wenn das geht, dann höchstens über Makros, aber auch da bin ich nicht sicher und denke, dass es eher nicht geht.</p>
<p>Was du versuchen könntest ist so eine Art Tuple zu erstellen. Dann hättest du zwar immer lediglich einen Parameter, aber da es ein Tuple wäre beliebig viele Parameter haben kann. Obwohl ich denke, dass auch das recht hässlich wird..</p>
<p>btw:<br />
In Eiffel, fällt mir ein, kann das so sehr gut gehandhabt werden, da es eine recht gute Tuple Unterstützung gibt.<br />
Hier ab ca. Seite 30:<br />
<a href="http://se.inf.ethz.ch/teaching/2009-H/eprog-0001/slides/17_agents.pdf" rel="nofollow">http://se.inf.ethz.ch/teaching/2009-H/eprog-0001/slides/17_agents.pdf</a></p>
<p>Hilft dir jetzt direkt wahrscheinlich nicht sehr viel, aber wenn du das wirklich implementieren willst, kannst du da sehen, wie die Handhabung in etwa geschen sollte, damit das ganze dann auch funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1863995</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1863995</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 03 Mar 2010 20:53:59 GMT</pubDate></item></channel></rss>