<?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[std::unique_ptr: Base -&amp;gt; Derived casten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu der Konvertierung von einem unique_ptr (Basiklasse) nach abgeleitet Klasse.</p>
<p>Es geht darum das ich die Basisklasse FooBase habe und die abgeleitete Klasse FooDerived.</p>
<p>In einer Map speichere ich</p>
<pre><code>std::map&lt;int, std::unique_ptr&lt;FooBase&gt;&gt;
</code></pre>
<p>Nun möchte ich den Zeiger natürlich bei Bedarf in einen Zeiger vom Typ</p>
<pre><code>std::unique_ptr&lt;FooDerived&gt;&gt;[/
</code></pre>
<p>casten.</p>
<p>Welche Vorgehensweise ist hier die Beste. Ich kann natürlich get() aufrufen und einen rohe Zeiger erhalten.</p>
<p>Interessanterweise führt der Compiler bei std::for_each() und dem Argument std::unique_ptr&lt;FooDerived&gt; automatisch eine Konvertierung durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/318734/std-unique_ptr-base-gt-derived-casten</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Jul 2026 19:54:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318734.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 24 Jul 2013 16:11:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:11:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Frage zu der Konvertierung von einem unique_ptr (Basiklasse) nach abgeleitet Klasse.</p>
<p>Es geht darum das ich die Basisklasse FooBase habe und die abgeleitete Klasse FooDerived.</p>
<p>In einer Map speichere ich</p>
<pre><code>std::map&lt;int, std::unique_ptr&lt;FooBase&gt;&gt;
</code></pre>
<p>Nun möchte ich den Zeiger natürlich bei Bedarf in einen Zeiger vom Typ</p>
<pre><code>std::unique_ptr&lt;FooDerived&gt;&gt;[/
</code></pre>
<p>casten.</p>
<p>Welche Vorgehensweise ist hier die Beste. Ich kann natürlich get() aufrufen und einen rohe Zeiger erhalten.</p>
<p>Interessanterweise führt der Compiler bei std::for_each() und dem Argument std::unique_ptr&lt;FooDerived&gt; automatisch eine Konvertierung durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340929</guid><dc:creator><![CDATA[thomas5_33]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:11:03 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:14:35 GMT]]></title><description><![CDATA[<p>thomas5_33 schrieb:</p>
<blockquote>
<p>Nun möchte ich den Zeiger natürlich bei Bedarf in einen Zeiger vom Typ</p>
<pre><code>std::unique_ptr&lt;FooDerived&gt;&gt;[/
</code></pre>
<p>casten.</p>
</blockquote>
<p>Das finde ich überhaupt nicht natürlich. Wozu meinst du das zu benötigen? Das ist eigentlich ein recht klares Zeichen, dass dein Design fehlerhaft ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340930</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:14:35 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:19:57 GMT]]></title><description><![CDATA[<p>Es gibt einen bestimmten Fall, wo ich Methoden der abgeleiteten Klasse brauche.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340931</guid><dc:creator><![CDATA[thomas5_33]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:19:57 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:25:26 GMT]]></title><description><![CDATA[<p>thomas5_33 schrieb:</p>
<blockquote>
<p>Es gibt einen bestimmten Fall, wo ich Methoden der abgeleiteten Klasse brauche.</p>
</blockquote>
<p>Das ist mir schon klar, dass du sicherlich irgendwas aus der abgeleiteten Klasse brauchen wirst, sonst würdest du nicht fragen. Und ich sage dir, wenn das so ist, dann ist der eigentlich Fehler im Design deiner Klassen. Da fände ich es ungünstig, dir zu erklären, wie du um den Fehler drumherum hacken kannst. Besser wäre eine detaillierte Erklärung deinerseits (also nicht nur das offensichtliche nennen), wieso du das brauchst. Dann könnte man dir wirklich helfen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340933</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:25:26 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:37:00 GMT]]></title><description><![CDATA[<p>mit .release() bekommst du den Besitz über den Zeiger zurück (d.h. der alte unique_ptr ruft kein delete auf.)<br />
Den Zeiger kannst du casten und in einen neuen unique_ptr reinstopfen.</p>
<p>static_pointer_cast gibt es leider nur für shared_ptr.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340935</guid><dc:creator><![CDATA[release]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:37:00 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 16:48:10 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>thomas5_33 schrieb:</p>
<blockquote>
<p>Es gibt einen bestimmten Fall, wo ich Methoden der abgeleiteten Klasse brauche.</p>
</blockquote>
<p>Das ist mir schon klar, dass du sicherlich irgendwas aus der abgeleiteten Klasse brauchen wirst, sonst würdest du nicht fragen. Und ich sage dir, wenn das so ist, dann ist der eigentlich Fehler im Design deiner Klassen. Da fände ich es ungünstig, dir zu erklären, wie du um den Fehler drumherum hacken kannst. Besser wäre eine detaillierte Erklärung deinerseits (also nicht nur das offensichtliche nennen), wieso du das brauchst. Dann könnte man dir wirklich helfen.</p>
</blockquote>
<p>Das ist mir bewusst. Ich denke auch aktuell über eine Designänderung nach, aber die goldene Lösung ist mir noch nicht eingefallen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340938</guid><dc:creator><![CDATA[thomas5_33]]></dc:creator><pubDate>Wed, 24 Jul 2013 16:48:10 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 17:16:15 GMT]]></title><description><![CDATA[<p>Unter der Annahme, dass der neue Zeiger nicht besitzend sein soll:</p>
<pre><code class="language-cpp">FooDerived *non_owning_ptr = dynamic_cast&lt;FooDerived*&gt;(owner.get());
</code></pre>
<p>Andernfalls würde ich über den Umstieg auf std::shared_ptr nachdenken, weil die Besitzverhältnisse mit einer unique_ptr-Konstruktion schwer überschaubar werden (was, wenn der Cast fehlschlägt, beispielsweise?). Dann gibt es std::dynamic_pointer_cast:</p>
<pre><code class="language-cpp">std::shared_ptr&lt;FooDerived&gt; new_ptr = std::dynamic_pointer_cast&lt;FooDerived&gt;(old_ptr);
</code></pre>
<p><strong>Gleichwohl:</strong> einen Downcast zu wollen, ist, wie schon erwähnt wurde, ein Symptom eines kaputten Designs. Wenn du mit dem Interface von FooBase nicht auskommst, solltest du entweder deine Zeiger so umstricken, dass sie auf das zeigen, was du wirklich brauchst, oder das Interface von FooBase entsprechend erweitern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340949</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340949</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Wed, 24 Jul 2013 17:16:15 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Wed, 24 Jul 2013 17:46:20 GMT]]></title><description><![CDATA[<p>thomas5_33 schrieb:</p>
<blockquote>
<pre><code>std::map&lt;int, std::unique_ptr&lt;FooBase&gt;&gt;
</code></pre>
<p>Nun möchte ich den Zeiger natürlich bei Bedarf in einen Zeiger vom Typ</p>
<pre><code>std::unique_ptr&lt;FooDerived&gt;&gt;[/
</code></pre>
</blockquote>
<p>Ist dir das &quot;unique&quot; im Namen nicht aufgefallen? Oder weisst du nur nicht was es bedeuten soll?<br />
Ich meine ... wie soll das gehen?</p>
<p>Ein &quot;Cast&quot; zerstört/verändert ja wohl nie den Ausgangswert. D.h. es müsste danach zwei &quot;unique&quot; Pointer geben die beide auf das selbe Objekt zeigen (dass die nen unterschiedlichen Typ haben ist dabei ja nicht relevant).<br />
D.h. sie sind nimmer &quot;unique&quot;.</p>
<p>=&gt; Kann nicht gehen.</p>
<p>Und das ganz abgesehen davon ob es jetzt ein Designfehler ist oder nicht.</p>
<p>=&gt; Caste den rohen Zeiger. =&gt; Problem gelöst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2340964</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2340964</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 24 Jul 2013 17:46:20 GMT</pubDate></item><item><title><![CDATA[Reply to std::unique_ptr: Base -&amp;gt; Derived casten on Thu, 25 Jul 2013 09:55:27 GMT]]></title><description><![CDATA[<p>thomas5_33 schrieb:</p>
<blockquote>
<p>Das ist mir bewusst. Ich denke auch aktuell über eine Designänderung nach, aber die goldene Lösung ist mir noch nicht eingefallen.</p>
</blockquote>
<p>Virtuelle Funktionen.</p>
<p>seldon schrieb:</p>
<blockquote>
<p><strong>Gleichwohl:</strong> einen Downcast zu wollen, ist, wie schon erwähnt wurde, ein Symptom eines kaputten Designs.</p>
</blockquote>
<p>Erst recht dynamische Downcasts. Es gibt schon sinnvolle Situationen, wo man tatsächlich downcasten muss, aber dann kennt man fast immer den abgeleiteten Typ und kann <code>static_cast</code> einsetzen.</p>
<p>seldon schrieb:</p>
<blockquote>
<p>Andernfalls würde ich über den Umstieg auf std::shared_ptr nachdenken, weil die Besitzverhältnisse mit einer unique_ptr-Konstruktion schwer überschaubar werden</p>
</blockquote>
<p>Ne, Besitzverhältnisse sind mit <code>unique_ptr</code> am überschaubarsten: Genau ein Zeiger hält das Objekt. Simpler gehts nicht.</p>
<p><code>shared_ptr</code> sollte man nur einsetzen, wenn man ihn <em>wirklich</em> braucht. Ist leider auch ein häufiger Designfehler...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2341083</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2341083</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 25 Jul 2013 09:55:27 GMT</pubDate></item></channel></rss>