<?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[clone()]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Basisklasse F sowie &gt; 100 abgeleitete Klassen F<sub>i</sub>. Die Basisklasse hat u.a. eine rein virtuelle Methode zum Clonen</p>
<pre><code>virtual F *clone() = 0;
</code></pre>
<p>Jetzt muss für jede abgeleitete Klasse F<sub>i</sub></p>
<pre><code>virtual F *clone() {return new F[t]i[/t](*this);}
</code></pre>
<p>geschrieben werden. Gibt es da eine (möglichst elegante) Methode, sich den ganzen &quot;Schreibkram&quot; vom Hals zu halten?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/242800/clone</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:40:32 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/242800.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 08 Jun 2009 11:32:44 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 11:33:50 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Basisklasse F sowie &gt; 100 abgeleitete Klassen F<sub>i</sub>. Die Basisklasse hat u.a. eine rein virtuelle Methode zum Clonen</p>
<pre><code>virtual F *clone() = 0;
</code></pre>
<p>Jetzt muss für jede abgeleitete Klasse F<sub>i</sub></p>
<pre><code>virtual F *clone() {return new F[t]i[/t](*this);}
</code></pre>
<p>geschrieben werden. Gibt es da eine (möglichst elegante) Methode, sich den ganzen &quot;Schreibkram&quot; vom Hals zu halten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723186</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723186</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Mon, 08 Jun 2009 11:33:50 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 11:36:53 GMT]]></title><description><![CDATA[<p>WIe hast du denn &gt;100 abgeleitete Klassen definiert ohne Schreibarbeit?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723189</guid><dc:creator><![CDATA[MonsterTruck]]></dc:creator><pubDate>Mon, 08 Jun 2009 11:36:53 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 12:16:40 GMT]]></title><description><![CDATA[<p>Über den Präprozessor lässt sich einiges machen. Über 100 abgeleitete Klassen geben mir allerdings zu denken, da bist du möglicherweise schon weit von &quot;elegant&quot; entfernt...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723218</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 08 Jun 2009 12:16:40 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 12:24:08 GMT]]></title><description><![CDATA[<p>jencas schrieb:</p>
<blockquote>
<p>geschrieben werden. Gibt es da eine (möglichst elegante) Methode, sich den ganzen &quot;Schreibkram&quot; vom Hals zu halten?</p>
</blockquote>
<p>Die Fi nicht von F sondern von einem Helpertemplate ableiten:</p>
<pre><code class="language-cpp">template&lt;class Derived, class Base&gt;
struct Cloneable : public Base
{
  virtual Base* clone()
  {
    return new Derived(*dynamic_cast&lt;Derived*&gt;(this));
  }
  virtual ~Cloneable() = 0 {} //verhindern dass Cloneable direkt instantiiert wird
};

class Fi : public Cloneable&lt;Fi, F&gt;
{
 /* ... */
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1723224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723224</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 08 Jun 2009 12:24:08 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 12:53:05 GMT]]></title><description><![CDATA[<p>warum dynamic_cast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723242</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723242</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 08 Jun 2009 12:53:05 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Mon, 08 Jun 2009 13:27:36 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>warum dynamic_cast?</p>
</blockquote>
<p>stimmt, static_cast hätts auch getan...</p>
<p>PS: clone() sollte natürlich auch const sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723265</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 08 Jun 2009 13:27:36 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Tue, 09 Jun 2009 08:44:23 GMT]]></title><description><![CDATA[<p>Zur Erklärung:</p>
<p>Es handelt sich um Funktoren, also recht &quot;kleine&quot; Klassen, die parametergesteuert in einer Factory zusammengestellt und von dieser in einem Container zurückgeliefert werden. In der Regel enthalten diese Klassen also nur den operator() sowie die Methode zum Clonen. Insofern stellt das clone() schon einen &quot;nicht unerheblichen Ballast&quot; dar.</p>
<p>Dank <a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a>: Dein Ansatz scheint genau das zu sein, was ich mir so vorgestellt habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723676</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723676</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Tue, 09 Jun 2009 08:44:23 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Tue, 09 Jun 2009 08:59:00 GMT]]></title><description><![CDATA[<p>Für Functoren scheint mir das allerdings der absolute Overkill zu sein. Bist du sicher dass du da ne Factory und dynamischen Polymorphismus mit dem ganze vtable-Overhead brauchst?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723683</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723683</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Jun 2009 08:59:00 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Tue, 09 Jun 2009 10:58:25 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Für Functoren scheint mir das allerdings der absolute Overkill zu sein. Bist du sicher dass du da ne Factory und dynamischen Polymorphismus mit dem ganze vtable-Overhead brauchst?</p>
</blockquote>
<p>Ja. Mal kurz zusammengefasst: die Factory liefert in Abhängigkeit diverser Parameter, die aus Benutzer-konfigurierbaren Tabellen stammen, einen Container von Funktoren, der dann wiederum per STL-Algorithmen auf Container angewendet wird, die die von den Funktoren zu bearbeitenden Daten enthalten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723769</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723769</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Tue, 09 Jun 2009 10:58:25 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Tue, 09 Jun 2009 11:09:53 GMT]]></title><description><![CDATA[<p>Hm. Ein alternativer Ansatz für so ein Szenario wäre evtl. folgender:<br />
Du machst dir eine Tabelle der möglichen Funktionen, die so ein Funktor ausführen kann. Du hast eine einzige Funktor-Klasse statt der zig Funktor-Klassen, und die Funktor-Objekte enthalten lediglich einen Funktionspointer auf die Funktion, deren Verhalten sie annehmen sollen. Die Factory erzeugt dann immer einen Funktor und setzt dessen Pointer auf die entsprechende Funktion in der Tabele. Der op() des Funktor delegiert den Aufruf einfach an die Funktion in der Tabelle.<br />
Das kopieren der Funktoren wird damit simpel, außerdem musst du die Funktoren nicht über Pointer herumreichen sondern kannst sie wie gewohnt als Objekte auf dem Stack behandeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723775</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723775</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 09 Jun 2009 11:09:53 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Tue, 09 Jun 2009 12:10:28 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Hm. Ein alternativer Ansatz für so ein Szenario wäre evtl. folgender:<br />
Du machst dir eine Tabelle der möglichen Funktionen, die so ein Funktor ausführen kann. Du hast eine einzige Funktor-Klasse statt der zig Funktor-Klassen, und die Funktor-Objekte enthalten lediglich einen Funktionspointer auf die Funktion, deren Verhalten sie annehmen sollen. Die Factory erzeugt dann immer einen Funktor und setzt dessen Pointer auf die entsprechende Funktion in der Tabele. Der op() des Funktor delegiert den Aufruf einfach an die Funktion in der Tabelle.<br />
Das kopieren der Funktoren wird damit simpel, außerdem musst du die Funktoren nicht über Pointer herumreichen sondern kannst sie wie gewohnt als Objekte auf dem Stack behandeln.</p>
</blockquote>
<p>Muss ich mal überdenken. Zusätzliches Problem ist nämlich, dass es sich um ein komplexes Multithreading-System handelt, in welchem mehrere der von mir oben beschriebenen Operationen parallel ausgeführt werden. Weil die &quot;Produktion&quot; der Funktorcontainer nämlich recht &quot;teuer&quot; ist, werden diese gecached und Clone an den anforderneden Thread ausgeliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1723811</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1723811</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Tue, 09 Jun 2009 12:10:28 GMT</pubDate></item><item><title><![CDATA[Reply to clone() on Thu, 09 Jul 2009 08:30:23 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Hm. Ein alternativer Ansatz für so ein Szenario wäre evtl. folgender:<br />
Du machst dir eine Tabelle der möglichen Funktionen, die so ein Funktor ausführen kann. Du hast eine einzige Funktor-Klasse statt der zig Funktor-Klassen, und die Funktor-Objekte enthalten lediglich einen Funktionspointer auf die Funktion, deren Verhalten sie annehmen sollen. Die Factory erzeugt dann immer einen Funktor und setzt dessen Pointer auf die entsprechende Funktion in der Tabele. Der op() des Funktor delegiert den Aufruf einfach an die Funktion in der Tabelle.<br />
Das kopieren der Funktoren wird damit simpel, außerdem musst du die Funktoren nicht über Pointer herumreichen sondern kannst sie wie gewohnt als Objekte auf dem Stack behandeln.</p>
</blockquote>
<p>Nach langer Zeit, bin ich mal wieder dazu gekommen, mich noch einmal mit diesem Problem zu beschäftigen. Dein Vorschlag funktioniert in diesem Falle so leider nicht, da die Funktoren Membervariablen haben, die in unterschiedlichen Containern voneinander abweichende Werte haben können.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739542</guid><dc:creator><![CDATA[jencas]]></dc:creator><pubDate>Thu, 09 Jul 2009 08:30:23 GMT</pubDate></item></channel></rss>