<?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[1 zu 1 Kopie einer Klasse]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Zeiger auf eine Klasse. In dieser Klasse sind weitere Zeiger vorhanden.<br />
Wie bekomme ich jetzt eine 1 zu 1 Kopie von der Klasse hin? Wenn ich normal kopiere werden natürlich die Zeiger mitkopiert, diese zeigen dann aber natürlich nach Destruktion der Klasse ins Leere.</p>
<p>Ich benötige also eine &quot;deep copy&quot; wenn ich das richtig sehe. Aber wie bekomme ich die unter C++ hin?</p>
<p>chewbo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/250380/1-zu-1-kopie-einer-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 05:01:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250380.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 17 Sep 2009 11:23:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 11:43:17 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe einen Zeiger auf eine Klasse. In dieser Klasse sind weitere Zeiger vorhanden.<br />
Wie bekomme ich jetzt eine 1 zu 1 Kopie von der Klasse hin? Wenn ich normal kopiere werden natürlich die Zeiger mitkopiert, diese zeigen dann aber natürlich nach Destruktion der Klasse ins Leere.</p>
<p>Ich benötige also eine &quot;deep copy&quot; wenn ich das richtig sehe. Aber wie bekomme ich die unter C++ hin?</p>
<p>chewbo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780345</guid><dc:creator><![CDATA[chewbo]]></dc:creator><pubDate>Thu, 17 Sep 2009 11:43:17 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 11:51:45 GMT]]></title><description><![CDATA[<p>Moin,</p>
<p>in dem Du einen Copy-Konstruktor schreibst und darin die einzelnen Member umkopierst</p>
<p>hand, mogel</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780367</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780367</guid><dc:creator><![CDATA[mogel]]></dc:creator><pubDate>Thu, 17 Sep 2009 11:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 11:53:49 GMT]]></title><description><![CDATA[<p>Du solltest erstmal sagen ob nach der deep copy beide Objekte auf dieselben Member-Exemplare verweisen sollen oder ob diese auch mitkopiert werden müssen. Also wenn in einem Objekt der Member verändert wird ob dieses auch im anderen sichtbar sein soll.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780369</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780369</guid><dc:creator><![CDATA[witte]]></dc:creator><pubDate>Thu, 17 Sep 2009 11:53:49 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 12:04:00 GMT]]></title><description><![CDATA[<p>Ich vermute mal: Falsches Forum.<br />
Falls doch C++/CLI: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-248502.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-248502.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780382</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780382</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Thu, 17 Sep 2009 12:04:00 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 12:24:14 GMT]]></title><description><![CDATA[<blockquote>
<p>mogel</p>
<p>13:51:45 17.09.2009 Titel: Zitieren<br />
Moin,</p>
<p>in dem Du einen Copy-Konstruktor schreibst und darin die einzelnen Member umkopierst</p>
<p>hand, mogel</p>
</blockquote>
<p>@morgel: Das ist bislang die einzige Möglichkeit die mir auch eingefallen ist, könnte aber recht aufwendig werden und würde am liebsten den Weg mit dem geringsten Widerstand gehen.</p>
<blockquote>
<p>witte</p>
<p>13:53:49 17.09.2009 Titel: Zitieren<br />
Du solltest erstmal sagen ob nach der deep copy beide Objekte auf dieselben Member-Exemplare verweisen sollen oder ob diese auch mitkopiert werden müssen. Also wenn in einem Objekt der Member verändert wird ob dieses auch im anderen sichtbar sein soll.</p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17815">@witte</a>: Es soll alles mitkopiert werden. Also ohne Verweise</p>
<blockquote>
<p>theta</p>
<p>14:04:00 17.09.2009 Titel: Zitieren<br />
Ich vermute mal: Falsches Forum.<br />
Falls doch C++/CLI: <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-248502.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-248502.html</a></p>
</blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19131">@theta</a> : Ja falsches Forum. Hab mich verklickt, weiss aber auch nicht wie ich den Beitrag verschiebe. Sollte natrürlich in das C++ Forum.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780406</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780406</guid><dc:creator><![CDATA[chewbo]]></dc:creator><pubDate>Thu, 17 Sep 2009 12:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 13:21:32 GMT]]></title><description><![CDATA[<p>chewbo schrieb:</p>
<blockquote>
<p>Das ist bislang die einzige Möglichkeit die mir auch eingefallen ist, könnte aber recht aufwendig werden und würde am liebsten den Weg mit dem geringsten Widerstand gehen.</p>
</blockquote>
<p>dann wirst Du Dich weiter auf eine <a href="http://www.lmgtfy.com/?q=einfacher+copy+konstruktor" rel="nofollow">weite Reise</a> begeben müssen anstatt es selbst zu machen ... und denke daran, Effizienz - mein junger Padawn - Effizienz und nicht Faulheit wird Dich zum Ziel führen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780488</guid><dc:creator><![CDATA[mogel]]></dc:creator><pubDate>Thu, 17 Sep 2009 13:21:32 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 13:24:50 GMT]]></title><description><![CDATA[<p>Dieser Thread wurde von Moderator/in <a href="http://www.c-plusplus.net/forum/profile-var-mode-is-viewprofile-and-u-is-18363.html" rel="nofollow">Jochen Kalmbach</a> aus dem Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-58.html" rel="nofollow">C++/CLI mit .NET</a> in das Forum <a href="http://www.c-plusplus.net/forum/viewforum-var-f-is-15.html" rel="nofollow">C++</a> verschoben.</p>
<p>Im Zweifelsfall bitte auch folgende Hinweise beachten:<br />
<a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-39405.html" rel="nofollow">C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?</a></p>
<p><em>Dieses Posting wurde automatisch erzeugt.</em></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780499</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780499</guid><dc:creator><![CDATA[C++ Forumbot]]></dc:creator><pubDate>Thu, 17 Sep 2009 13:24:50 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 13:44:04 GMT]]></title><description><![CDATA[<p>wo liegt das problem? also was verstehst du nicht?</p>
<pre><code class="language-cpp">struct T
{
  /*...*/
};

struct X
{
private:
  T* m;

public:
  X(const X &amp;other) : m(0)
  {
    try
    {
      m = new T(other.m);
    }
    catch(...)
    {
      delete m;
      throw;
    }
  }
};
</code></pre>
<p>eigtl würde</p>
<pre><code class="language-cpp">X(const X &amp;other)
  {
    m = new T(other.m);
  }
</code></pre>
<p>reichen, allerdings können hier an 2 Stellen Exceptions fliegen: Beim Speicher anfordern und im Copy-CTor von T. Also könnte es sein, dass der Speicher (erfolgreich) angefordert wurde und dann ne Exception fliegt und du ein Speicherleck hast, da für nicht fertig erstellte Objekte kein Destruktor erstellt wird und somit auch kein evtl. belegter Speicherplatz freigegeben wird (-&gt;&quot;Memory Leak&quot;).<br />
Das Problem könnte man auch über ein placement-new lösen:<br />
Allerdings sehe ich darin keinen Vorteil</p>
<pre><code class="language-cpp">//#include &lt;new&gt;
  X(const X &amp;other) : m(::operator new[sizeof(T)])
  {
    try
    {
      m = new(m) T(other.m);
    }
    catch(...)
    {
      ::operator delete (m);
      throw;
    }
  }

  ~X()
  {
    if(m)
    {
      m-&gt;~T();
      ::operator delete(m);
    }
  }
</code></pre>
<p>bb</p>
<p>edit: im normalfall sieht der DTor von X natürlich so aus:</p>
<pre><code class="language-cpp">~X()
  {
    delete m;
  }
</code></pre>
<p>nicht, dass du den vergisst^^</p>
<p>du solltest aber daran denken, dass du nicht nur CopyCTor sondern auch op= überladen musst (das löst man am besten über das -&gt;&quot;Copy and swap Idiom&quot;).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780513</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 17 Sep 2009 13:44:04 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:06:25 GMT]]></title><description><![CDATA[<p>chewbo schrieb:</p>
<blockquote>
<p>ich habe einen Zeiger auf eine Klasse. In dieser Klasse sind weitere Zeiger vorhanden.<br />
Wie bekomme ich jetzt eine 1 zu 1 Kopie von der Klasse hin? Wenn ich <strong>normal kopiere</strong> werden natürlich die Zeiger mitkopiert, diese zeigen dann aber natürlich nach Destruktion der Klasse ins Leere.</p>
</blockquote>
<p>Das klingt danach, als ob das Objekt für die Verwaltung der anderen Objekte zuständig ist (Du zerstörst sie ja im Destruktor, wenn ich das richtig rausgelesen habe). <em>Beachte einfach die <a href="http://de.wikipedia.org/wiki/Dreierregel_(C%2B%2B)" rel="nofollow">Dreierregel</a> und alles wird gut</em>.</p>
<p>Falls Dein Zeiger vom Typ ABC* ist, wobei ABC eine abstrakte Klasse ist, kannst Du in der Klasse noch eine virtuelle clone-Funktion hinzufügen, in etwa so:</p>
<pre><code class="language-cpp">class ABC
{
public:
  virtual ~ABC() {}
  virtual ABC* clone() const = 0;
  ...
};
</code></pre>
<p>Das sind übrigens C++ Basics. Schnapp Dir ein schlaues Buch und lerne.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780526</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780526</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:36:26 GMT]]></title><description><![CDATA[<p>unskilled schrieb:</p>
<blockquote>
<p>eigtl würde</p>
<pre><code class="language-cpp">X(const X &amp;other)
  {
    m = new T(other.m);
  }
</code></pre>
<p>reichen,</p>
</blockquote>
<p>Tut es auch!</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>allerdings können hier an 2 Stellen Exceptions fliegen: Beim Speicher anfordern und im Copy-CTor von T. Also könnte es sein, dass der Speicher (erfolgreich) angefordert wurde und dann ne Exception fliegt und du ein Speicherleck hast, da für nicht fertig erstellte Objekte kein Destruktor erstellt wird und somit auch kein evtl. belegter Speicherplatz freigegeben wird (-&gt;&quot;Memory Leak&quot;).</p>
</blockquote>
<p>Falsch! Wenn ein Konstruktor bei &quot; <code>new T(...)</code> &quot; eine Ausnahme wirft, wird der Speicher automatisch wieder freigegeben.</p>
<p>edit: unskilled spricht hier -- so wie ich -- von dem Speicher, der für das T-Objekt reserviert, nicht von Speicher, der innerhalb des Konstruktors reserviert werden könnte.</p>
<p>unskilled schrieb:</p>
<blockquote>
<p>Das Problem könnte man auch über ein placement-new lösen:<br />
[...scheußlicher Programmcode...]</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780531</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:36:26 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:17:12 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>unskilled schrieb:</p>
<blockquote>
<p>allerdings können hier an 2 Stellen Exceptions fliegen: Beim Speicher anfordern und im Copy-CTor von T. Also könnte es sein, dass der Speicher (erfolgreich) angefordert wurde und dann ne Exception fliegt und du ein Speicherleck hast, da für nicht fertig erstellte Objekte kein Destruktor erstellt wird und somit auch kein evtl. belegter Speicherplatz freigegeben wird (-&gt;&quot;Memory Leak&quot;).</p>
</blockquote>
<p>Falsch! Wenn ein Konstruktor bei &quot; <code>new T(...)</code> &quot; eine Ausnahme wirft, wird der Speicher automatisch wieder freigegeben.</p>
</blockquote>
<p>Ich glaub er meint den innerhalb des Copy-Ctor angeforderten Speicher. Wenn später im Ctor dann eine Exception fliegt ist der tatsächlich verloren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780537</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:22:33 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Falsch! Wenn ein Konstruktor bei &quot; <code>new T(...)</code> &quot; eine Ausnahme wirft, wird der Speicher automatisch wieder freigegeben.</p>
</blockquote>
<p>Diese Aussage würde ich schlicht und ergreifend als Falsch, oder zumindest als stark Missverständlich (gerade Anfängern gegenüber) interpretieren:</p>
<pre><code class="language-cpp">class A
{
    private:
        T1 * p1;
        T2 * p2;
    public:
        A()
        : p1(new T1()),
          p2(new T2())
        {}
        //...
}
</code></pre>
<p>Es stimmt zwar das der Speicherplatz der beiden Zeiger egal wie aufgeräumt wird, nicht aber die Objekte auf die sie verweisen. Wenn bei der Konstruktion von p2 eine Exception geworfen wird, wird der Speicher auf den p1 zeigt NICHT aufgeräumt. Um dies zu automatisieren braucht es schon RAII-Techniken (Smartpointer...).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780542</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780542</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:22:33 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:47:45 GMT]]></title><description><![CDATA[<p>asc schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Falsch! Wenn ein Konstruktor bei &quot; <code>new T(...)</code> &quot; eine Ausnahme wirft, wird der Speicher automatisch wieder freigegeben.</p>
</blockquote>
<p>Diese Aussage würde ich schlicht und ergreifend als Falsch, oder zumindest als stark Missverständlich (gerade Anfängern gegenüber)</p>
</blockquote>
<p>Du hast die Aussage aus dem Kontext genommen. Der Speicher, von dem sowohl unskilled als auch ich rede ist der, der über new für das zu entstehende T-Objekt reserviert worden ist. Um weiteren Missverständnissen vorzubeugen, habe ich das nochmal in dem vorherigen Post besonders betont.</p>
<p>T hat (siehe unskilled's Beispiel) einfach Ausnahme-sicher zu sein. Wenn es das nicht ist, kann man innerhalb von X auch nichts mehr retten -- auch nicht mit einem Placement-New.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780558</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780558</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:47:45 GMT</pubDate></item><item><title><![CDATA[Reply to 1 zu 1 Kopie einer Klasse on Thu, 17 Sep 2009 14:53:37 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Der Speicher, von dem sowohl unskilled als auch ich rede ist der, der über new für das zu entstehende T-Objekt reserviert worden ist.</p>
</blockquote>
<p>korrekt - wusste nicht, dass der speicher für das objekt an sich automatisch wieder freigegeben wird, wenn im ctor eine exception geworfen wird...<br />
danke für die richtigstellung</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1780564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1780564</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 17 Sep 2009 14:53:37 GMT</pubDate></item></channel></rss>