<?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[type erasure - dynamic_cast problem]]></title><description><![CDATA[<p>Hi,<br />
ich habe höchstwahrscheinlich ein kleines Verständnis Problem bei dynamic_cast oder der Anwendung von type erasure.</p>
<p>Ich habe eine Basisklasse:</p>
<pre><code>class json_basic{ json_basic(){} virtual json_basic(){}};

template&lt;typename T&gt;
class json_value : public json_basic
{
public: 
json_value(T value) : value_(value) {}
virtual ~json_value(){}
T value_;
};

class JSON
{
JSON() {}
~JSON() {}

unordered_map&lt;string, json_basic&gt; children;

template&lt;typename T&gt;
const T &amp; get_cref()
{
json_value&lt;T&gt; * ptr;
		auto it = children.find(search);

		if (it != children.end())
		{
			ptr = dynamic_cast &lt;json_value&lt;T&gt;*&gt;(it-&gt;second.get());

			return ptr-&gt;value_;
		}
}
};
</code></pre>
<p>Soweit so gut.<br />
Mein Problem ist jetzt, dass natürlich der unique_ptr für ein solches Datenmodell ungeeignet ist, weil ich nicht in der Lage bin meine Objekte zu kopieren.<br />
Ich könnte auch auf shared_ptr umsteigen und alles würde funktionieren allerdings hätte ich gerne ein richtiges copy.</p>
<p>Ist es möglich dynamic cast auf normalen Objekten oder referencen zu casten?<br />
Ich habe das nämlich semantisch nicht hingekriegt.</p>
<p>Beim Versuch einen richtigen Copy Construktor zu schreiben und den Value auf den der unique_ptr zeigt zu kopieren bin ich leider gescheitert, da meine json_values nicht wissen, was für ein Datentyp sie sind.</p>
<p>Jemand eine Idee?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/329096/type-erasure-dynamic_cast-problem</link><generator>RSS for Node</generator><lastBuildDate>Tue, 07 Jul 2026 02:32:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/329096.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 07 Nov 2014 15:21:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to type erasure - dynamic_cast problem on Fri, 07 Nov 2014 15:34:03 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe höchstwahrscheinlich ein kleines Verständnis Problem bei dynamic_cast oder der Anwendung von type erasure.</p>
<p>Ich habe eine Basisklasse:</p>
<pre><code>class json_basic{ json_basic(){} virtual json_basic(){}};

template&lt;typename T&gt;
class json_value : public json_basic
{
public: 
json_value(T value) : value_(value) {}
virtual ~json_value(){}
T value_;
};

class JSON
{
JSON() {}
~JSON() {}

unordered_map&lt;string, json_basic&gt; children;

template&lt;typename T&gt;
const T &amp; get_cref()
{
json_value&lt;T&gt; * ptr;
		auto it = children.find(search);

		if (it != children.end())
		{
			ptr = dynamic_cast &lt;json_value&lt;T&gt;*&gt;(it-&gt;second.get());

			return ptr-&gt;value_;
		}
}
};
</code></pre>
<p>Soweit so gut.<br />
Mein Problem ist jetzt, dass natürlich der unique_ptr für ein solches Datenmodell ungeeignet ist, weil ich nicht in der Lage bin meine Objekte zu kopieren.<br />
Ich könnte auch auf shared_ptr umsteigen und alles würde funktionieren allerdings hätte ich gerne ein richtiges copy.</p>
<p>Ist es möglich dynamic cast auf normalen Objekten oder referencen zu casten?<br />
Ich habe das nämlich semantisch nicht hingekriegt.</p>
<p>Beim Versuch einen richtigen Copy Construktor zu schreiben und den Value auf den der unique_ptr zeigt zu kopieren bin ich leider gescheitert, da meine json_values nicht wissen, was für ein Datentyp sie sind.</p>
<p>Jemand eine Idee?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426391</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426391</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Fri, 07 Nov 2014 15:34:03 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure - dynamic_cast problem on Fri, 07 Nov 2014 15:31:08 GMT]]></title><description><![CDATA[<p>Du brauchst so etwas wie unique_ptr. Der Kopierkonstruktor ruft dann für jedes Element eine neue virtuelle Methode clone() auf, die einen unique_ptr&lt;json_basic&gt; als Kopie von sich zurückliefert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426392</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426392</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Fri, 07 Nov 2014 15:31:08 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure - dynamic_cast problem on Fri, 07 Nov 2014 15:59:17 GMT]]></title><description><![CDATA[<p>Hi Nathan,<br />
entschuldige aber so ganz habe ich deine Antwort nicht verstanden.<br />
Ich habe es mal so gebaut, wie ich es verstanden habe, aber ich bekomme einen initializing error: cannot convert frm 'json_value&lt;T&gt;' to 'std::unique_ptr&lt;json_basic, std::default_delete&lt;_Ty&gt;&gt;, error.</p>
<pre><code>class json_basic
{ 
json_basic(){} 
virtual json_basic(){}};
virtual unique_ptr&lt;json_baisc&gt; clone() {}

template&lt;typename T&gt;
class json_value : public json_basic
{
public: 
json_value(T value) : value_(value) {}
virtual ~json_value(){}
T value_;

virtual unique_ptr&lt;JSON_basic&gt; clone()
{
   unique_ptr&lt;JSON_basic&gt;temp = this;
   return temp;
}
};

class JSON
{
JSON() {}
~JSON() {}

unordered_map&lt;string, json_basic&gt; children;

template&lt;typename T&gt;
const T &amp; get_cref()
{
json_value&lt;T&gt; * ptr;
        auto it = children.find(search);

        if (it != children.end())
        {
            ptr = dynamic_cast &lt;json_value&lt;T&gt;*&gt;(it-&gt;second.get());

            return ptr-&gt;value_;
        }
}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2426395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426395</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Fri, 07 Nov 2014 15:59:17 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure - dynamic_cast problem on Fri, 07 Nov 2014 16:13:47 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">virtual unique_ptr&lt;json_baisc&gt; clone() {}

virtual unique_ptr&lt;JSON_basic&gt; clone()
{
   unique_ptr&lt;JSON_basic&gt;temp = this;
   return temp;
}
</code></pre>
</blockquote>
<p>Könntest du uns bitte den richtigen Code zeigen? Hier weiss man gar nicht, was falsch ist und was nur falsch kopiert wurde.</p>
<p>Die Implementierung muss natürlich so aussehen:</p>
<pre><code class="language-cpp">virtual unique_ptr&lt;JSON_basic&gt; clone()
{
   return unique_ptr&lt;JSON_basic&gt;(new json_value(*this));
   // oder besser seit C++14
   return make_unique&lt;json_value&gt;(*this);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2426397</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426397</guid><dc:creator><![CDATA[klaun]]></dc:creator><pubDate>Fri, 07 Nov 2014 16:13:47 GMT</pubDate></item><item><title><![CDATA[Reply to type erasure - dynamic_cast problem on Fri, 07 Nov 2014 16:53:36 GMT]]></title><description><![CDATA[<p>klaun schrieb:</p>
<blockquote>
<blockquote>
<pre><code class="language-cpp">virtual unique_ptr&lt;json_baisc&gt; clone() {}

virtual unique_ptr&lt;JSON_basic&gt; clone()
{
   unique_ptr&lt;JSON_basic&gt;temp = this;
   return temp;
}
</code></pre>
</blockquote>
<p>Könntest du uns bitte den richtigen Code zeigen? Hier weiss man gar nicht, was falsch ist und was nur falsch kopiert wurde.</p>
<p>Die Implementierung muss natürlich so aussehen:</p>
<pre><code class="language-cpp">virtual unique_ptr&lt;JSON_basic&gt; clone()
{
   return unique_ptr&lt;JSON_basic&gt;(new json_value(*this));
   // oder besser seit C++14
   return make_unique&lt;json_value&gt;(*this);
}
</code></pre>
</blockquote>
<p>Entschuldigung, ich hätte nochmal genauer kontrollieren sollen.<br />
Ich wollte euch auch nicht mit zuviel Code belästigen.</p>
<p>Zu deinem Code:<br />
Danke!!!<br />
Hat mein Problem vollkommen gelöst und funktioniert einwandfrei, nachdem ich clone() in CTOR und Copy-Operator eingebaut hatte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2426406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2426406</guid><dc:creator><![CDATA[chp++]]></dc:creator><pubDate>Fri, 07 Nov 2014 16:53:36 GMT</pubDate></item></channel></rss>