<?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[Deserialisierung zu Pointer oder zu Referenz]]></title><description><![CDATA[<p>Hallo,</p>
<p>Nach der Deserialisierung stehe ich vor der Frage, wie ich die Objekte an weitere Objekte weitergeben kann. Folgendes Beispiel soll die Situation in etwa schildern:</p>
<pre><code class="language-cpp">Class C;

Class D : C; // D erbt von Klasse C,
Class E : C; // E erbt ebenfalls von Klasse C,

Class Pool{
map&lt;int, C&amp;&gt; classPool; //Container für alle Klassen Subtyp C

fill(){
 // Gespeicherte Objekte werden geladen und auf die Map gepusht
 D deserialisiertD = D( serinfo1, serinfo2); 
 classPool.push(1, deserialisiertD&amp;); // ist natürlich Blödsinn 
}

Class Controller{ // Der Controller verarbeitet die geladenen Objekte weiter
Pool &amp; pool; 
}
</code></pre>
<p>Wie kann ich die deserialisierten Objekte auf die Map zu legen, um sie mit dem dem Controller weiterverarbeiten zu können?</p>
<p>1. Problem: Natürlich kann ich die geladenen Objekte nicht byValue auf die Map pushen, da es sich um Sub-Typen handelt. Das würde schliesslich zu Slicing führen und die Spezialisierung ginge verloren. Richtig?</p>
<p>2. Problem: Auf die Map wie im Beispiel byReference pushen geht ja wohl auch nicht, da die Objekte nach Verlassen der Funktion fill verloren gehen. Richtig?</p>
<p>3. Problem: Sollte ich mit meinen beiden vor gängigen Aussagen Recht haben, bleibt mir nur noch die Möglichkeit mit NEW zu arbeiten. Bis jetzt konnte ich NEW recht gut vermeiden.<br />
Hier stellt sich für mich die Frage ob ich es mit auto_ptr aus STL versuchen oder gleich den shared_ptr von Boost verwenden soll. Wie ist eure Erfahrung?</p>
<p>Seht ihr eine Möglichkeit das Design so anzupassen, dass passByReference oder byValue trotzdem möglich ist?</p>
<p>Danke für die Tipps und Inputs.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/249671/deserialisierung-zu-pointer-oder-zu-referenz</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 08:37:10 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/249671.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Sep 2009 14:44:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Thu, 10 Sep 2009 14:44:03 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Nach der Deserialisierung stehe ich vor der Frage, wie ich die Objekte an weitere Objekte weitergeben kann. Folgendes Beispiel soll die Situation in etwa schildern:</p>
<pre><code class="language-cpp">Class C;

Class D : C; // D erbt von Klasse C,
Class E : C; // E erbt ebenfalls von Klasse C,

Class Pool{
map&lt;int, C&amp;&gt; classPool; //Container für alle Klassen Subtyp C

fill(){
 // Gespeicherte Objekte werden geladen und auf die Map gepusht
 D deserialisiertD = D( serinfo1, serinfo2); 
 classPool.push(1, deserialisiertD&amp;); // ist natürlich Blödsinn 
}

Class Controller{ // Der Controller verarbeitet die geladenen Objekte weiter
Pool &amp; pool; 
}
</code></pre>
<p>Wie kann ich die deserialisierten Objekte auf die Map zu legen, um sie mit dem dem Controller weiterverarbeiten zu können?</p>
<p>1. Problem: Natürlich kann ich die geladenen Objekte nicht byValue auf die Map pushen, da es sich um Sub-Typen handelt. Das würde schliesslich zu Slicing führen und die Spezialisierung ginge verloren. Richtig?</p>
<p>2. Problem: Auf die Map wie im Beispiel byReference pushen geht ja wohl auch nicht, da die Objekte nach Verlassen der Funktion fill verloren gehen. Richtig?</p>
<p>3. Problem: Sollte ich mit meinen beiden vor gängigen Aussagen Recht haben, bleibt mir nur noch die Möglichkeit mit NEW zu arbeiten. Bis jetzt konnte ich NEW recht gut vermeiden.<br />
Hier stellt sich für mich die Frage ob ich es mit auto_ptr aus STL versuchen oder gleich den shared_ptr von Boost verwenden soll. Wie ist eure Erfahrung?</p>
<p>Seht ihr eine Möglichkeit das Design so anzupassen, dass passByReference oder byValue trotzdem möglich ist?</p>
<p>Danke für die Tipps und Inputs.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775959</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775959</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 10 Sep 2009 14:44:03 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Thu, 10 Sep 2009 14:57:13 GMT]]></title><description><![CDATA[<p>Wenn du in der map nen Zeiger hast</p>
<pre><code class="language-cpp">map&lt;int, C*&gt; classPool;
</code></pre>
<p>... oder versteh ich grad was falsch?</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775971</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 10 Sep 2009 14:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Thu, 10 Sep 2009 15:00:12 GMT]]></title><description><![CDATA[<p>varginator schrieb:</p>
<blockquote>
<p>Wenn du in der map nen Zeiger hast</p>
<pre><code class="language-cpp">map&lt;int, C*&gt; classPool;
</code></pre>
<p>... oder versteh ich grad was falsch?</p>
<p>Gruß Simon</p>
</blockquote>
<p>Danke Simon -&gt; Ja mit dem Zeiger würde es gehen. Wobei sich gleich die Anschluss-Frage stellt, ob man mit &quot;intelligenten&quot; Zeigern arbeiten solle oder nicht.</p>
<p>Aber ich denke auch, ohne Zeiger lässt sich da nicht mehr viel machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775975</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 10 Sep 2009 15:00:12 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Thu, 10 Sep 2009 15:05:33 GMT]]></title><description><![CDATA[<p>Ja, mit &quot;intelligenten&quot; Zeigern wär es warscheinlich einfacher, aber es kommt auch drauf an, ob du die Original Objekte noch benötigst, oder ob sie bei &quot;Beenden der Map&quot; auch gelöscht werden können ...</p>
<p>Gruß Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1775981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1775981</guid><dc:creator><![CDATA[varginator]]></dc:creator><pubDate>Thu, 10 Sep 2009 15:05:33 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Thu, 10 Sep 2009 15:48:38 GMT]]></title><description><![CDATA[<p>Die Map überlebt die ganze Laufzeit der Applikation.<br />
Auf der Map würden dann ja eh nur die Zeiger auf die Objekte liegen.</p>
<p>Solange die Zeiger bestehen, würden auch die entsprechenden Objekte bestehen bleiben. Genau was ich will.</p>
<p>Bekomme ich das schon mit auto_ptr aus STL hin oder brauche dazu boost::shared_ptr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776016</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776016</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 10 Sep 2009 15:48:38 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Fri, 11 Sep 2009 09:41:01 GMT]]></title><description><![CDATA[<p><code>std::auto_ptr</code> kann wegen seiner speziellen Kopiersemantik<sup>1)</sup> gefährlich in STL-Containern sein. <code>boost::shared_ptr</code> (bzw. <code>std::tr1::shared_ptr</code> ) ist hingegen kein Problem. Auch eine Möglichkeit wäre <code>boost::ptr_map</code> , allerdings bin ich von der Umsetzung <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-242495.html" rel="nofollow">nicht sehr begeistert</a>.</p>
<p>_____</p>
<ol>
<li>Wenn ein <code>std::auto_ptr</code> -Objekt von einem anderen kopiert wird, sind die beiden Objekte danach nicht gleich, weil dem Original der Zeiger entrissen wird. Diese Gegebenheit wird allerdings oft als Axiom angesehen, und kann zu Problemen führen, wenn zum Beispiel lokale Kopien angelegt werden.</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1776356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776356</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 11 Sep 2009 09:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Fri, 11 Sep 2009 12:13:19 GMT]]></title><description><![CDATA[<p>Danke für die Inputs</p>
<p>Habe mich gleich an die Umsetzung mit boost::shared_ptr gemacht.</p>
<p>Das erste Problem stellt sich auch schon: Ich möchte einen Pointer auf this als Parameter einer Funktion weitergeben.</p>
<pre><code class="language-cpp">this-&gt;attachedDevice.receiveMsg( boost::shared_ptr&lt;ISurveillant&gt;(this));
</code></pre>
<p>Wenn ich nun <code>this</code> schön in einen <code>shared_ptr</code> verpacke bekomme ich Probleme -&gt; Nach Verlassen shared_ptr Scope löscht dieser natürlich auch gleich noch <code>this</code> mit. Das verunmöglicht die Rückkehr in das Objekt natürlich. Bang!</p>
<p>Wie verpacke ich <code>this</code> richtig in ein shared_ptr?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776478</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Fri, 11 Sep 2009 12:13:19 GMT</pubDate></item><item><title><![CDATA[Reply to Deserialisierung zu Pointer oder zu Referenz on Fri, 11 Sep 2009 14:00:15 GMT]]></title><description><![CDATA[<p>Vielleicht hilf dir <code>enable_shared_from_this</code> ...</p>
<p>Ansonsten: Für passive, nur verweisende Zeiger brauchst du keine Smart Pointer. Smart Pointer repräsentieren besitzergreifende Zeiger und sind im Normalfall auch für die Löschung der Objekte verantwortlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1776580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1776580</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 11 Sep 2009 14:00:15 GMT</pubDate></item></channel></rss>