<?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[Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen?]]></title><description><![CDATA[<p>Ich bin gerade in der Designphase eines kleinen Spiels das C++ und SDL verwendet. Besondere Schwierigkeit bereitet mir die Umsetzung des Eventhandlings. Dazu habe ich mir zwei Konzepte überlegt und ich wüsste gerne von euch welches davon &quot;besser&quot; ist oder ob ihr vielleicht noch einen ganz anderen Vorschlag habt.</p>
<p>Konzept 1:</p>
<pre><code class="language-cpp">class EventManager {
    // Diese Liste speichert alle Objekte, die auf Events reagieren wollen
    list&lt;Callback*&gt; cbs;
    // sendet das Event an jedes Objekt in der Callbackliste
    void handleEvents();
};
class Callback {
    // Diese Methode wird vom EventManager aufgerufen
    virtual bool onMouseButtonDown(int x, int y) = 0;
};
// eine konkrete Implementation des Interfaces
class ButtonCallback : public Callback {
    bool onMouseButtonDown(int x, int y) { /* führe aktion aus */ }
};
</code></pre>
<p>Ich schätze mal das ist die &quot;klassische&quot; objektorientierte Umsetzung, oder? (Das Observer-Pattern ist ja noch erkennbar)</p>
<p>Konzept 2:</p>
<pre><code class="language-cpp">// Die Signatur einer Callbackfunktion für Mausklicks
typedef boost::function&lt;bool (int, int)&gt; callback;
class EventManager {
    // Diese Liste speichert alle Funktionen, die auf Events reagieren
    std::list&lt;callback*&gt; cbs;
    // ruft alle Funktionen in der Liste auf
    void handleEvents()
};
// freie Funktion
bool onMouseButtonDown(int x, int y) { /* führe Aktion aus */ }
class Button {
    // Memberfunktion
    bool onMouseButtonDown(int x, int y) { /* führe Aktion aus */ }
    // Funktor
    bool operator() (int x, int y) { /* führe Aktion aus */ }
};
// freie Funktion
callback a(onMouseButtonDown);
// Memberfunktion
Button button;
callback b(boost::bind(&amp;Button::onMouseButtonDown, &amp;button, _1, _2));
// Funktor
callback c(button);
}
</code></pre>
<p>Das ist dann die etwas &quot;andere&quot; Umsetzung. Was meint ihr, taugt sie was oder bin ich blind und sehe ihren großen Nachteil nicht?</p>
<p>Konzept 3 wäre die Verwendung von boost::signal oder libsigc++, aber so großes Kaliber brauch ich für mein kleines Spiel eigentlich gar nicht.</p>
<p>Vielen Dank im voraus <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/201100/callbacks-für-eventhandling-mit-polymorphie-oder-boost-function-umsetzen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 19:42:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/201100.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 24 Dec 2007 12:27:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Mon, 24 Dec 2007 12:27:57 GMT]]></title><description><![CDATA[<p>Ich bin gerade in der Designphase eines kleinen Spiels das C++ und SDL verwendet. Besondere Schwierigkeit bereitet mir die Umsetzung des Eventhandlings. Dazu habe ich mir zwei Konzepte überlegt und ich wüsste gerne von euch welches davon &quot;besser&quot; ist oder ob ihr vielleicht noch einen ganz anderen Vorschlag habt.</p>
<p>Konzept 1:</p>
<pre><code class="language-cpp">class EventManager {
    // Diese Liste speichert alle Objekte, die auf Events reagieren wollen
    list&lt;Callback*&gt; cbs;
    // sendet das Event an jedes Objekt in der Callbackliste
    void handleEvents();
};
class Callback {
    // Diese Methode wird vom EventManager aufgerufen
    virtual bool onMouseButtonDown(int x, int y) = 0;
};
// eine konkrete Implementation des Interfaces
class ButtonCallback : public Callback {
    bool onMouseButtonDown(int x, int y) { /* führe aktion aus */ }
};
</code></pre>
<p>Ich schätze mal das ist die &quot;klassische&quot; objektorientierte Umsetzung, oder? (Das Observer-Pattern ist ja noch erkennbar)</p>
<p>Konzept 2:</p>
<pre><code class="language-cpp">// Die Signatur einer Callbackfunktion für Mausklicks
typedef boost::function&lt;bool (int, int)&gt; callback;
class EventManager {
    // Diese Liste speichert alle Funktionen, die auf Events reagieren
    std::list&lt;callback*&gt; cbs;
    // ruft alle Funktionen in der Liste auf
    void handleEvents()
};
// freie Funktion
bool onMouseButtonDown(int x, int y) { /* führe Aktion aus */ }
class Button {
    // Memberfunktion
    bool onMouseButtonDown(int x, int y) { /* führe Aktion aus */ }
    // Funktor
    bool operator() (int x, int y) { /* führe Aktion aus */ }
};
// freie Funktion
callback a(onMouseButtonDown);
// Memberfunktion
Button button;
callback b(boost::bind(&amp;Button::onMouseButtonDown, &amp;button, _1, _2));
// Funktor
callback c(button);
}
</code></pre>
<p>Das ist dann die etwas &quot;andere&quot; Umsetzung. Was meint ihr, taugt sie was oder bin ich blind und sehe ihren großen Nachteil nicht?</p>
<p>Konzept 3 wäre die Verwendung von boost::signal oder libsigc++, aber so großes Kaliber brauch ich für mein kleines Spiel eigentlich gar nicht.</p>
<p>Vielen Dank im voraus <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/1425590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425590</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Mon, 24 Dec 2007 12:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Mon, 24 Dec 2007 13:33:38 GMT]]></title><description><![CDATA[<p>ich denke mit dem simplen ansatz über ein callback (listener interface) wirst du glücklicher werden. das ganze boost gemüse wird schnell unübersichtlich. und man sollte immer die einfache lösung der komplizierteren vorziehen, wenn nicht ganz trifftige gründe für die kompliziertere lösung sprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425617</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425617</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Mon, 24 Dec 2007 13:33:38 GMT</pubDate></item><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Mon, 24 Dec 2007 15:24:52 GMT]]></title><description><![CDATA[<p>Danke für deine Einschätzung, thordk. Ich hatte jetzt eigentlich eher zu der boost-Lösung tendiert, weil ich sie für sehr flexibel gehalten habe und ich im ersten Designentwurf mit dem Observer-Pattern auf einige Probleme gestoßen bin. Ich denke ich muss das ganze mal ein wenig genauer erläutern. (Zusatzinfo: es wird ein sehr kleines 2D-RTS).</p>
<p>Objekte, die auf Mausklicks reagieren sind die Buttons im Menü und die Tiles in der Karte. Muss ich mir jetzt für jeden Button eine Klasse schreiben, die von Callback erbt? Wie regel ich die Beziehung zwischen Button und ButtonCallback? Der Button &quot;hat-ein&quot; ButtonCallback und der ButtonCallback &quot;kennt-seinen&quot; Button. Diese Doppelbeziehung könnte man vermeiden, indem man ButtonCallback weglässt und direkt Button von Callback erben lässt. Jeder Button erfüllt aber eine andere Funktionalität, also müsste man für jeden Button eine Klasse von Button ableiten. Und da ist noch die Frage ist ein Button überhaupt ein Callback?</p>
<p>Dazu kommt, dass der Eventmanager den Mausklick immer an alle Tiles senden würde, aber da die Karte scrollbar ist, kommen ja gar nicht alle in Frage. Es wäre doch viel besser wenn die Karte auf den Mausklick reagiert, dann berechnet auf welches Tile geklickt wurde und von diesem Tile die onMouseButtonDown-Methode aufruft. Gleiches ließe sich auch auf das Menü übertragen, das das Event nur an die gerade sichtbaren Buttons weiterleitet.</p>
<p>Da stellt sich irgendwann die Frage ob man <em>überhaupt</em> Callbacks benötigt. Ich meine für die Mausklicks eigentlich nicht. Für die Mausbewegungen auch nicht, da nur die Karte Mausbewegungen verarbeitet (zum scrollen). Aber irgendwann würde man vielleicht mal gern Abkürzungstasten einbauen und an diesem Punkt ist die Zahl der Objekte, die auf Tastendrücke reagiert unbestimmt, das kann die Eventmanager-Klasse nicht wissen. Spätestens hier wäre es angebracht in einer map/multimap zu jeder Taste eine Callbackfunktion zu speichern. Also wenn man es irgendwann doch braucht, warum dann nicht gleich von Anfang an verwenden?</p>
<p>Angesichts des &quot;für jede Funktionalität eine Klasse von Callback erben lassen&quot;-Problems bin ich dann auf die boost::function-Lösung gekommen. Ich kann mir für eine bestimmte Funktion immer noch eine eigene Klasse schreiben oder einfach nur eine freie Funktion oder eine bestehende Methode einer Klasse als Methodenzeiger übergeben. Und ich benötige auch nur eine Buttonklasse, die einfach eine boost::function speichert. Dann schreibe ich Funktionen/Funktoren für jede gewünschte Aktion und erstelle einen Button, dem ich die Funktion übergebe. Oder gibt es hier auch eine ganz simple Lösung mit Vererbung und Polymorphie?</p>
<p>Es tut mir leid dass der Text so lang geworden ist, aber ich finde solche Designentscheidungen sind extrem wichtig und sollten nur mit reiflicher Überlegung getroffen werden. Also wo liege ich mit meinen Einschätzungen falsch, wo habe ich den einfachen, schnellen Weg übersehen, mache ich mir einfach alles zu kompliziert?</p>
<p>btw Frohe Weihnachten noch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";-)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425665</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Mon, 24 Dec 2007 15:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Mon, 24 Dec 2007 15:45:43 GMT]]></title><description><![CDATA[<p>sollen deine tiles &quot;heavy weight&quot; werden? die tiles sind das user interface. durch die tiles interagiert der anwender mit dem programm und aus dem kontext des tiles heraus können dann unterschiedliche dinge passieren. wenn ich in aller kürze drüber nachdenke, würde ich die tiles in einen event manager stecken. nämlich einen &quot;map manager&quot;. reduziert auf seine basisfunktionalität ist ein tile nichts anderes als ein diskreter punkt, den der anwender ansteuern kann. der kontext muss also informiert werden. so gesehen sind tiles hochgradig invariant. sie unterscheiden sich lediglich in einer koordinate. d.h. der map manager registriert einen klick auf einen tile und kann daraufhin listener über diesen klick informieren. typischerweise sind diese listener teile der steuerung. soll eine einheit bewegt werden? oder soll eine einheit markiert werden? oder soll evtl. nur eine information über das tile angezeigt werden. will der spieler eine einheit selektieren, kann daraufhin wieder der manager der einheiten ein event verschicken, welches den grafik manager interessiert. dieser updated dann die grafik, um die selektion zu verdeutlichen. woraufhin weitere listener aktiviert werden, die auf selektion reagieren.</p>
<p>kurz gesagt: viele kleine light weight observer, anstatt eines einzigen riesigen event managers, der sonst mit events nur so überschüttet wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425668</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Mon, 24 Dec 2007 15:45:43 GMT</pubDate></item><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Mon, 24 Dec 2007 16:10:43 GMT]]></title><description><![CDATA[<p>So langsam glaube ich sogar, ich sehe die ganze Sache noch nicht kompliziert genug. Die Funktion des Mapmanagers hätte bei mir direkt die Klasse Map übernommen. Ich habe im aktuellen Entwurf bereits 18 Klassen und das obwohl es nur ein sehr kleines Spiel werden soll und ich noch keine Zeile Programmcode geschrieben habe (außer ein paar Tests mit boost::function). Steuerbare Einheiten sind vorerst nicht geplant und ich hätte in diesem Fall das Design auch an anderer Stelle anders aufbauen müssen. Die Tiles sind so groß wie die Gebäude. Das heißt auf einem Tile steht ein Gebäude und ein Gebäude steht auf einem Tile.</p>
<p>Die Klasse map erfährt also von einem Mausklick, sie überprüft ob auf die map geklickt wurde, sie berechnet das Tile auf das geklickt wurde und ruft die passende Methode des Tiles auf. Handelt es sich um ein leeres Tile veranlasst das Tile das Menü dazu die richtigen labels und buttons anzuzeigen. Klickt man dann z.B. auf Haus bauen, so soll auf dem aktiven Tile das Haus errichtet werden. Handelt es sich um ein bebautes Tile soll das Menü entsprechend die Informationen und Funktionen dieses Gebäudes anzeigen.</p>
<p>Ich wollte diesen Bereich vorerst einfach so simpel wie möglich halten und für diesen Punkt spielt es auch gar keine so große Rolle wie die Callbacks realisiert sind oder ob überhaupt Callbacks verwendet werden.</p>
<p>Wie würdest du denn die Sache mit den Buttons angehen? Vorallem dass ich nicht für jeden individuellen Button eine extra Klasse von Button/von einem bestimmten Interface ableiten muss. Oder ist das gar nicht so schlimm und völlig normal?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1425677</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1425677</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Mon, 24 Dec 2007 16:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to Callbacks für Eventhandling mit Polymorphie oder boost::function umsetzen? on Tue, 25 Dec 2007 21:07:22 GMT]]></title><description><![CDATA[<p>Könnte ein Moderator den Thread vielleicht ins Forum für Spiele- und Grafikprogrammierung verschieben, da sich da vielleicht noch ein paar Experten für dieses Themengebiet rumtreiben? Ich weiß sonst echt nicht wo ich noch um Rat fragen soll, da ich die boost::function-Lösung echt nicht schlecht fand.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1426089</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1426089</guid><dc:creator><![CDATA[OhneName]]></dc:creator><pubDate>Tue, 25 Dec 2007 21:07:22 GMT</pubDate></item></channel></rss>