<?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[wie elegant copy anlegen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Methode, welche ein abstraktes B bekommt. Dann habe ich eine Liste, welche Pointer auf B's speichert. In der Liste möchte ich eine Kopie des B's speichern. Da die B's abstrakt sind, kann ich dies nur über eine dup() Methode erreichen, welche allerdings ein A (Oberklasse von <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> speichert. Mein Code sieht wie folgt aus:</p>
<pre><code class="language-cpp">void
        Transfer::storeMessage(B &amp; msg){

            //not already stored?
            if(!retransmitMessageQueue.contains(msg)){

                //store the message
                //A* dup() const;
                B * copyMsg = (B*)msg.dup();  //&lt;&lt;--- geht dies eleganter?
                retransmitMessageQueue.add(copyMsg);
            }//end if
        }
</code></pre>
<p>Aufgerufen wird dann die Methode ala store(c), wobei c vom Typ C ist, welches von B erbt.<br />
Geht die markierte Stelle eleganter??</p>
<p>Gruß<br />
sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/309996/wie-elegant-copy-anlegen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 05 Aug 2026 00:08:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/309996.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Nov 2012 10:47:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 10:47:38 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>ich habe eine Methode, welche ein abstraktes B bekommt. Dann habe ich eine Liste, welche Pointer auf B's speichert. In der Liste möchte ich eine Kopie des B's speichern. Da die B's abstrakt sind, kann ich dies nur über eine dup() Methode erreichen, welche allerdings ein A (Oberklasse von <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> speichert. Mein Code sieht wie folgt aus:</p>
<pre><code class="language-cpp">void
        Transfer::storeMessage(B &amp; msg){

            //not already stored?
            if(!retransmitMessageQueue.contains(msg)){

                //store the message
                //A* dup() const;
                B * copyMsg = (B*)msg.dup();  //&lt;&lt;--- geht dies eleganter?
                retransmitMessageQueue.add(copyMsg);
            }//end if
        }
</code></pre>
<p>Aufgerufen wird dann die Methode ala store(c), wobei c vom Typ C ist, welches von B erbt.<br />
Geht die markierte Stelle eleganter??</p>
<p>Gruß<br />
sven_</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266167</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266167</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Thu, 01 Nov 2012 10:47:38 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 10:52:49 GMT]]></title><description><![CDATA[<p>Du kannst den Cast weglassen, wenn deine Klassenhierarchie wirklich so aussieht, wie du beschreibst. Falls der Compiler sich beschwert, dann hast du irgendwo etwas falsch gemacht. Aber stelle ihn dann niemals durch einen reinterpret_cast (und das ist solch ein C-Cast im schlimmsten Falle) ruhig! In der Regel hat er nämlich recht.</p>
<p>Ansonsten ist dieses Vorgehen so durchaus üblich. Clone Pattern wird das auch gerne genannt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266171</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 01 Nov 2012 10:52:49 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 11:02:54 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>clone Pattern, wieder was neues. <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>
<p>Ohne cast bekomme ich:</p>
<pre><code class="language-cpp">error: invalid conversion from ‘A*’ to ‘B*’
</code></pre>
<p>Mein B ist:</p>
<pre><code class="language-cpp">class B : public A {...}
</code></pre>
<p>???<br />
sven</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266177</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266177</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Thu, 01 Nov 2012 11:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 11:04:46 GMT]]></title><description><![CDATA[<p>Nachtrag:</p>
<p>Die dup Methode sieht so aus:</p>
<p>[cpp]<br />
virtual A * dup() const = 0;<br />
[cpp]</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266178</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Thu, 01 Nov 2012 11:04:46 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 11:37:42 GMT]]></title><description><![CDATA[<p>sven_ schrieb:</p>
<blockquote>
<p>Nachtrag:</p>
<p>Die dup Methode sieht so aus:</p>
<pre><code class="language-cpp">virtual A * dup() const = 0;
</code></pre>
<p>Gruß</p>
</blockquote>
<p>Und ich wette die Implementierung in B gibt auch einen A* zurück, oder? Hier kommt jetzt der große Trick: Die Rückgabewerte von virtuellen Methoden dürfen in den abgeleiteten Klassen auch spezialisiertere Versionen des Rückgabetyps aus der Basisklasse zurück geben (unter bestimmten Regeln, die du irgendwo nachlesen kannst). Das heißt, das dup in B darf einen B* zurück geben! Problem gelöst.</p>
<p>Das nennt man covariant return types. Hier eine Erklärung, sogar genau anhand deiner Problemstellung (denn diese ist wohl die häufigste Anwendung dafür):<br />
<a href="http://www.lwithers.me.uk/articles/covariant.html" rel="nofollow">http://www.lwithers.me.uk/articles/covariant.html</a><br />
Für mehr Infos einfach mal nach dem Stichwort googeln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266185</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266185</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 01 Nov 2012 11:37:42 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 13:47:18 GMT]]></title><description><![CDATA[<p>Hallo SeppJ,</p>
<p>vielen Dank. Wieder was gelernt. Tolles Forum hier. Ich dank dir vielmals!!!!!</p>
<p><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.<br />
sven</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266222</guid><dc:creator><![CDATA[sven_]]></dc:creator><pubDate>Thu, 01 Nov 2012 13:47:18 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 13:54:00 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das nennt man covariant return types. Hier eine Erklärung, sogar genau anhand deiner Problemstellung (denn diese ist wohl die häufigste Anwendung dafür):<br />
<a href="http://www.lwithers.me.uk/articles/covariant.html" rel="nofollow">http://www.lwithers.me.uk/articles/covariant.html</a></p>
</blockquote>
<p>Hat das eigentlich schon mal jemand für etwas anderes als clone() verwendet?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266224</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266224</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Thu, 01 Nov 2012 13:54:00 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 15:53:43 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Das nennt man covariant return types. Hier eine Erklärung, sogar genau anhand deiner Problemstellung (denn diese ist wohl die häufigste Anwendung dafür):<br />
<a href="http://www.lwithers.me.uk/articles/covariant.html" rel="nofollow">http://www.lwithers.me.uk/articles/covariant.html</a><br />
Für mehr Infos einfach mal nach dem Stichwort googeln.</p>
</blockquote>
<p>In dem von dir verlinkten Dokument gibt es einen Fehler:</p>
<blockquote>
<p>Often, the derived class has a polymorphic function which returns a more specific (i.e. more derived) type than the base class. This is per fectly legal, since the pointer is automatically downcast to the base class type.</p>
</blockquote>
<p>Downcasten zu einem Basisklassenpointer? Das ist doch ein upcast?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266271</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 01 Nov 2012 15:53:43 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 16:04:03 GMT]]></title><description><![CDATA[<p>Oh nein! Ruft die Polizei! Ein kleiner Verdreher in einer inoffiziellen Terminologie wo trotzdem jeder wusste, was gemeint ist, weil es direkt dahinter noch einmal ausdrücklich beschrieben steht. Das ist der Untergang des Abendlandes! Morgen werden wir wieder auf Bäumen leben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266277</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 01 Nov 2012 16:04:03 GMT</pubDate></item><item><title><![CDATA[Reply to wie elegant copy anlegen on Thu, 01 Nov 2012 16:06:06 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Oh nein! Ruft die Polizei! Ein kleiner Verdreher in einer inoffiziellen Terminologie wo trotzdem jeder wusste, was gemeint ist, weil es direkt dahinter noch einmal ausdrücklich beschrieben steht. Das ist der Untergang des Abendlandes! Morgen werden wir wieder auf Bäumen leben.</p>
</blockquote>
<p>Downcast und Upcast vertauschen? Das ist doch nich' gut ist das doch nich'! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f621.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--pouting_face"
      title=":rage:"
      alt="😡"
    /></p>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Bin schon still.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2266282</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2266282</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Thu, 01 Nov 2012 16:06:06 GMT</pubDate></item></channel></rss>