<?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[User soll Code einfügen. Ableitung oder Handler oder ...?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse, die fast nur aus Nutzdaten besteht:</p>
<pre><code class="language-cpp">struct DrawOperation {
   Indices* indices;
   int indexCount;
   vector&lt;VBPass&gt; vbPasses;
};

struct VBPass {
   int start;
   int count;
   ...
};
</code></pre>
<p>Ein Benutzer meines Codes/Bibliothek füllt die DrawOperation mit VBPass'es. In meinem Code wird dann über die vbPasses iteriert und pro vbpass wird gezeichnet. Das Problem: Es muss möglich sein, dass Usercode unmittelbar vor dem Zeichnen ausgeführt wird:</p>
<pre><code class="language-cpp">//Das hier ist in meiner Bibliothek. Soll nicht änderbar sein durch den Anwender
foreach vbpass in vbpasses
   setValuesXY
   call user code
   draw vbpass
</code></pre>
<p>Wie mache ich das am besten, dass der Anwender meiner Lib Code schreiben kann, der vorm zeichnen ausgeführt wird? Füge ich in VBPass eine pure virtual Methode ein, so dass der User von VBPass ableiten muss? Oder gebe ich besser VBPass einen Handler mit Callback Funktionen? Oder was ganz anderes?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289404/user-soll-code-einfügen-ableitung-oder-handler-oder</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 03:52:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289404.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 Jul 2011 10:27:41 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 10:27:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klasse, die fast nur aus Nutzdaten besteht:</p>
<pre><code class="language-cpp">struct DrawOperation {
   Indices* indices;
   int indexCount;
   vector&lt;VBPass&gt; vbPasses;
};

struct VBPass {
   int start;
   int count;
   ...
};
</code></pre>
<p>Ein Benutzer meines Codes/Bibliothek füllt die DrawOperation mit VBPass'es. In meinem Code wird dann über die vbPasses iteriert und pro vbpass wird gezeichnet. Das Problem: Es muss möglich sein, dass Usercode unmittelbar vor dem Zeichnen ausgeführt wird:</p>
<pre><code class="language-cpp">//Das hier ist in meiner Bibliothek. Soll nicht änderbar sein durch den Anwender
foreach vbpass in vbpasses
   setValuesXY
   call user code
   draw vbpass
</code></pre>
<p>Wie mache ich das am besten, dass der Anwender meiner Lib Code schreiben kann, der vorm zeichnen ausgeführt wird? Füge ich in VBPass eine pure virtual Methode ein, so dass der User von VBPass ableiten muss? Oder gebe ich besser VBPass einen Handler mit Callback Funktionen? Oder was ganz anderes?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088574</guid><dc:creator><![CDATA[MartinD]]></dc:creator><pubDate>Mon, 04 Jul 2011 10:27:41 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 10:41:28 GMT]]></title><description><![CDATA[<p>erweitere die struct VBPass um einen Member vom Typ <a href="http://www.boost.org/doc/libs/1_46_1/doc/html/function.html" rel="nofollow">boost::function&lt;void()&gt;</a> und rufe diesen, falls er belegt ist, vor dem Zeichnen auf.</p>
<pre><code class="language-cpp">#include &lt;boost/function.hpp&gt;
struct VBPass {
   int start;
   int count;
   boost::function&lt; void() &gt; m_pre_step;
   ...
};
</code></pre>
<p>bei Dir in der Lib dann:</p>
<pre><code class="language-cpp">if( vbpass.m_pre_step )
    vbpass.m_pre_step();
// weiter mit Zeichnen von vbpass
</code></pre>
<p>.. und verpasse VBPass einen oder mehrere für den Benutzer sinnvolle Konstruktoren.</p>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088580</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Mon, 04 Jul 2011 10:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 11:18:55 GMT]]></title><description><![CDATA[<p>Tja, wenn das so einfach zu beantworten waere ...</p>
<blockquote>
<p>Füge ich in VBPass eine pure virtual Methode ein, so dass der User von VBPass ableiten muss?</p>
</blockquote>
<p>Ich nehm an, der Usercode wird ueber ne dll eingefuegt oder ?<br />
Bei allen anderen Themen haettest DU andere Probleme <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>Klassen-Interfaces über Dll:<br />
Klar, schoener als CallBacks, aber Du nagelst den User auf einen Compiler fest, der zu deinem kompatible Klassen erzeugt. Generell nur bein selben hersteller, und meistens nur ueber minor versionen gegeben. Und man kann es mit COmpiler-Optionen fast immer aushebeln ...</p>
<p>Würd ich nur machen, wenn Deine &quot;User&quot; im überschaubaren Rahmen bleiben ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088595</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088595</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 04 Jul 2011 11:18:55 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 11:41:41 GMT]]></title><description><![CDATA[<p>RHBaum schrieb:</p>
<blockquote>
<p>Tja, wenn das so einfach zu beantworten waere ...</p>
<blockquote>
<p>Füge ich in VBPass eine pure virtual Methode ein, so dass der User von VBPass ableiten muss?</p>
</blockquote>
<p>Ich nehm an, der Usercode wird ueber ne dll eingefuegt oder ?<br />
Bei allen anderen Themen haettest DU andere Probleme <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>Ne, ist eine statische Lib. Was sind eigentlich die Pro/Kontra Argumente bzgl Handler Klasse (also sowas wie class Handler { virtual void pre() = 0; } und boost::function?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088606</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088606</guid><dc:creator><![CDATA[MartinD]]></dc:creator><pubDate>Mon, 04 Jul 2011 11:41:41 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 11:44:57 GMT]]></title><description><![CDATA[<p>Warum macht ihr es eigentlich so kompliziert, DLL,...? Warum muss ein User Code einfügen? Wieso schreibt ihr nicht einfach Code nur für euch? Glaubt ihr wirklich das ihr das neue Framework für alle schreibt? Wenn man in nem forum nachfragen muss, wie das geht, ist das eher unwahrscheinlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088607</guid><dc:creator><![CDATA[tödörödödö]]></dc:creator><pubDate>Mon, 04 Jul 2011 11:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 12:01:20 GMT]]></title><description><![CDATA[<p>MartinD schrieb:</p>
<blockquote>
<p>RHBaum schrieb:</p>
<blockquote>
<p>Tja, wenn das so einfach zu beantworten waere ...</p>
<blockquote>
<p>Füge ich in VBPass eine pure virtual Methode ein, so dass der User von VBPass ableiten muss?</p>
</blockquote>
<p>Ich nehm an, der Usercode wird ueber ne dll eingefuegt oder ?<br />
Bei allen anderen Themen haettest DU andere Probleme <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>Ne, ist eine statische Lib. Was sind eigentlich die Pro/Kontra Argumente bzgl Handler Klasse (also sowas wie class Handler { virtual void pre() = 0; } und boost::function?</p>
</blockquote>
<p>Ein Interface ist &quot;intrusive&quot;. Das heißt, jeder der User-Code bereitstellen will muss davon ableiten. Man kann dann genau eine Funktion in der abgeleiteten Klasse bereitstellen (eben die virtuelle), welche dann den User-Code bereitsstellt.<br />
Bei boost::function kannst Du quasi jede Funktion benutzen, welche irgendwie das passende Interface hat:</p>
<pre><code class="language-cpp">//freie Funktion
void function(VBPass &amp; v)
{...}

//Methoden
class VBPass_Utility
{
public:
    void fun1(VBPass &amp; v);
    void fun2(VBPass &amp; v);
};

//Funktor
class VPass_Funktor
{
public:
    void operator()(VBPass &amp; v);
};

//der boost::function-Typ
typedef boost::function&lt;void (VBPass &amp; v)&gt; callback_t;

class DrawOperation
{
public:
    void do_stuff(callback_t const &amp; user_code = callback_t())
    {
        if(user_code)
        {
            user_code(vpass_object); //callback aufrufen
        }
    }
};

//...
DrawOperation drawer;

drawer.do_stuff(&amp;function); //benutzt freie funktion

VBPass_Utility util;
drawer.do_stuff(boost::bind(&amp;VBPass_Utility::fun1, &amp;util, _1); //benutzt util.fun1
drawer.do_stuff(boost::bind(&amp;VBPass_Utility::fun2, &amp;util, _1); //benutzt util.fun2

drawer.do_stuff(DrawOperation()); //benutzt DrawOperation::operator()

drawer.do_stuff(); //fuehrt gar keinen User-Code aus
</code></pre>
<p>Du bist also sehr frei darin zu bestimmen, wo genau dein Callback herkommen soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088611</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 04 Jul 2011 12:01:20 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 12:47:17 GMT]]></title><description><![CDATA[<blockquote>
<p>Ne, ist eine statische Lib.</p>
</blockquote>
<p>Wer compiliert die Lib ?<br />
Ist dieser ominöse &quot;User&quot; Teil eures Teams, also habts den 100% unter Kontrolle ?</p>
<blockquote>
<p>Was sind eigentlich die Pro/Kontra Argumente bzgl Handler Klasse (also sowas wie class Handler { virtual void pre() = 0; } und boost::function?</p>
</blockquote>
<p>Virtuelle funktionen sind quasi der c++ Ersatz fuer FunktionsPointer/CallBacks.<br />
Damit hasst aehnliche Vor und Nachteile wie bei ner C zu C++ disskussion <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 />
Wer C-Callbacks intuitiv und natuerlich empfindet, der wird immer gegen ein Klasseninterface wettern.</p>
<p>Aber ganz speziell:<br />
Vorteile Interface:<br />
intuitiverer Code -&gt; einfachere Einarbeit -&gt; wartbarer Code (wenn man OO denken kann/will )</p>
<p>Vorteile Funktionspointer:<br />
C - kompatibel, dadurch binaer 100% spezifizierbar. Kannst Du so bauen, Implementationen mit irgendwelchen COmpilern gebaut werden koennen, die C konforme EInsprungpunkte bauen koennen. Neben C/C++ Compilern koennen das auch andere ...<br />
Dieser &quot;Vorteil&quot; kommt aber oft erst in spaeteren Ausbau eines Projects zum tragen. Für Projecte ist es ein absolutes K.O kriterium, wenn du den Compiler beim HauptProjekt änderst(beispielsweisse Migration VS Studio 2005 zu 2010) und alle &quot;anderen&quot; (meistens Plugins, oder Aufgaben-bezogene Dll's) müssen mit nachgezogen werden.<br />
Nen Simples neucompilieren kann zum No-Go werden, besonders wenn man den Sourcecode nicht kontrolliert, sondern der von nem Zulieferer gewartet wird ...</p>
<p>Ciao ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088638</guid><dc:creator><![CDATA[RHBaum]]></dc:creator><pubDate>Mon, 04 Jul 2011 12:47:17 GMT</pubDate></item><item><title><![CDATA[Reply to User soll Code einfügen. Ableitung oder Handler oder ...? on Mon, 04 Jul 2011 12:52:48 GMT]]></title><description><![CDATA[<p>tödörödödö schrieb:</p>
<blockquote>
<p>Warum macht ihr es eigentlich so kompliziert, DLL,...? Warum muss ein User Code einfügen? Wieso schreibt ihr nicht einfach Code nur für euch? Glaubt ihr wirklich das ihr das neue Framework für alle schreibt? Wenn man in nem forum nachfragen muss, wie das geht, ist das eher unwahrscheinlich.</p>
</blockquote>
<p>Manche übertreiben es etwas, das stimmt schon.</p>
<p>Andrerseits schreibt man auch verdammt oft Code, den man dann - meist im selben Projekt - selbst &quot;verwendet&quot;. Und auch oft an mehr als nur einer Stelle. Da macht es schon Sinn halbwegs sauber zu arbeiten. Und da gehört IMO auch das Trennen von Zuständigkeiten dazu.</p>
<p>Bzw. es bringt auch viel bezüglich Verständlichkeit/Wartbarkeit des Programms. Je sauberer die einzelnen Teile getrennt sind, desto einfacher kann man z.B. Fehler eingrenzen oder Änderungen machen.</p>
<p>----</p>
<p>@MartinD<br />
Ich würde auch <code>boost::function</code> (bzw. <code>std::function</code> ) empfehlen. Warum? Weil es die Kopplung zwischen deiner Klasse und dem &quot;verwendenden Code&quot; reduziert. Und weil es praktischer ist. Mit virtuellen Funktionen müsste jeder User erstmal ne eigenen Klasse ableiten und die Funktion überschreiben. Das ist mehr Aufwand, als einfach nen (z.B. mit <code>boost::bind</code> / <code>std::bind</code> zusammengebauten) Funktor zu übergeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088641</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 Jul 2011 12:52:48 GMT</pubDate></item></channel></rss>