<?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[Smartpointer: Upcast Problem]]></title><description><![CDATA[<p>Hi, ich habe 2 Klassen:</p>
<p>A{B*}<br />
und<br />
B:A{A*[]}</p>
<p>Also A besitzt einen &quot;Pointer&quot; auf B, und B wiederum kann ganzviele Instanzen von A halten.<br />
Nun möchte ich das ganze mit Smartpointer realisieren (mit normalen Pointern funktioniert es bereits):</p>
<pre><code class="language-cpp">class B;
class A
{
   boost::weak_ptr&lt;B&gt; parent;
};
class B:public A
{
   std::vector&lt;boost::shared_ptr&lt;A&gt; &gt; children;
};
</code></pre>
<p>Nun habe ich folgendes getestet:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;A&gt; shared_parent(new B);// soll ein als kind gespeichertes B darstellen
boost::weak_ptr&lt;B&gt; weak_parent= shared_parent;// soll den Parentverweis in A selber simulieren.
</code></pre>
<p>Aber natürlich klappt das so nicht, der Compiler meldet eine &quot;Invalid conversion from A* to B*&quot;,<br />
womit er ja auch recht hat. Nur wie mach ich das dann mit smartpointern?<br />
Eine Lösung wäre aus dem B* in A ein A* zu machen, was aber dann im Design zu einer Schwäche führt,<br />
und ich deshalb eigentlich nicht will.<br />
Also, wie kann ich es erreichen, das aus eine sh&lt;A&gt; ein weak&lt;B&gt; wird?</p>
<p>Problem gelöst, mit dynamic_pointer_cast gehts:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;A&gt; shared_parent(new B);// soll ein als kind gespeichertes B darstellen
boost::weak_ptr&lt;B&gt; weak_parent= boost::dynamic_pointer_cast&lt;Parent,base&gt;(shared_parent);// soll den Parentverweis in A selber simulieren.
shared_parent.reset();
if(weak_parent.expired())
   std::cout &lt;&lt; &quot;Pointer expired&quot; &lt;&lt; std::endl;
else
   std::cout &lt;&lt; &quot;Pointer valid&quot; &lt;&lt; std::endl;
</code></pre>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/161403/smartpointer-upcast-problem</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 19:59:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/161403.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 06 Oct 2006 10:27:18 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Smartpointer: Upcast Problem on Fri, 06 Oct 2006 11:07:55 GMT]]></title><description><![CDATA[<p>Hi, ich habe 2 Klassen:</p>
<p>A{B*}<br />
und<br />
B:A{A*[]}</p>
<p>Also A besitzt einen &quot;Pointer&quot; auf B, und B wiederum kann ganzviele Instanzen von A halten.<br />
Nun möchte ich das ganze mit Smartpointer realisieren (mit normalen Pointern funktioniert es bereits):</p>
<pre><code class="language-cpp">class B;
class A
{
   boost::weak_ptr&lt;B&gt; parent;
};
class B:public A
{
   std::vector&lt;boost::shared_ptr&lt;A&gt; &gt; children;
};
</code></pre>
<p>Nun habe ich folgendes getestet:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;A&gt; shared_parent(new B);// soll ein als kind gespeichertes B darstellen
boost::weak_ptr&lt;B&gt; weak_parent= shared_parent;// soll den Parentverweis in A selber simulieren.
</code></pre>
<p>Aber natürlich klappt das so nicht, der Compiler meldet eine &quot;Invalid conversion from A* to B*&quot;,<br />
womit er ja auch recht hat. Nur wie mach ich das dann mit smartpointern?<br />
Eine Lösung wäre aus dem B* in A ein A* zu machen, was aber dann im Design zu einer Schwäche führt,<br />
und ich deshalb eigentlich nicht will.<br />
Also, wie kann ich es erreichen, das aus eine sh&lt;A&gt; ein weak&lt;B&gt; wird?</p>
<p>Problem gelöst, mit dynamic_pointer_cast gehts:</p>
<pre><code class="language-cpp">boost::shared_ptr&lt;A&gt; shared_parent(new B);// soll ein als kind gespeichertes B darstellen
boost::weak_ptr&lt;B&gt; weak_parent= boost::dynamic_pointer_cast&lt;Parent,base&gt;(shared_parent);// soll den Parentverweis in A selber simulieren.
shared_parent.reset();
if(weak_parent.expired())
   std::cout &lt;&lt; &quot;Pointer expired&quot; &lt;&lt; std::endl;
else
   std::cout &lt;&lt; &quot;Pointer valid&quot; &lt;&lt; std::endl;
</code></pre>
<p>phlox</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1150461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1150461</guid><dc:creator><![CDATA[phlox81]]></dc:creator><pubDate>Fri, 06 Oct 2006 11:07:55 GMT</pubDate></item></channel></rss>