<?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[Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?!]]></title><description><![CDATA[<p>Gibt es sowas in &quot;elegant&quot;? Oder muss ich jedes Element von Hand kopieren?</p>
<pre><code class="language-cpp">class Klasse1
{
    Klasse1();
    ~Klasse1();

private:
    Klasse2 obj;
};
</code></pre>
<pre><code class="language-cpp">void
Klasse1::operator= (const Klasse1&amp; ref)
{
    if (this == &amp;ref) return;
    *this = *ref;
}
</code></pre>
<pre><code class="language-cpp">...
Klasse1* test = new Klasse1();
Klasse1* test2 = test;

delete test;
...
</code></pre>
<p>Das ist doch nur eine &quot;flache Kopie&quot;, oder? Sprich &quot;copy by reference&quot;?! Ich war der Meinung, dass obj angelegt aber nach <strong>delete test</strong> auch wieder gelöscht wird. Wie ist es wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/141498/zuweisungsoperator-für-quot-tiefe-kopien-quot</link><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 13:20:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/141498.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 22 Mar 2006 15:12:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:12:06 GMT]]></title><description><![CDATA[<p>Gibt es sowas in &quot;elegant&quot;? Oder muss ich jedes Element von Hand kopieren?</p>
<pre><code class="language-cpp">class Klasse1
{
    Klasse1();
    ~Klasse1();

private:
    Klasse2 obj;
};
</code></pre>
<pre><code class="language-cpp">void
Klasse1::operator= (const Klasse1&amp; ref)
{
    if (this == &amp;ref) return;
    *this = *ref;
}
</code></pre>
<pre><code class="language-cpp">...
Klasse1* test = new Klasse1();
Klasse1* test2 = test;

delete test;
...
</code></pre>
<p>Das ist doch nur eine &quot;flache Kopie&quot;, oder? Sprich &quot;copy by reference&quot;?! Ich war der Meinung, dass obj angelegt aber nach <strong>delete test</strong> auch wieder gelöscht wird. Wie ist es wirklich?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021774</guid><dc:creator><![CDATA[ConstRef]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:12:06 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:27:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Klasse1
{
    Klasse1();
    ~Klasse1();

private:
    Klasse2 obj;
};
</code></pre>
<p>Falls Klasse2 einen eigenen Zuweisungs-Operator und Copy-Konstruktor hat, brauchst du diese Funktionen für Klasse1 überhaupt nicht anzulegen. Das macht der Compiler automatisch für dich.</p>
<p>Dieser Code hier:</p>
<pre><code class="language-cpp">void
Klasse1::operator= (const Klasse1&amp; ref)
{
    if (this == &amp;ref) return;
    *this = *ref;
}
</code></pre>
<p>erzeugt eine Endlosrekursion. Schlechte Idee!</p>
<pre><code class="language-cpp">...
Klasse1* test = new Klasse1();
Klasse1* test2 = test;

delete test;
...
</code></pre>
<p>Du legst hier eine Kopie des Zeigers an. Es gibt in deinem Beispiel nur ein einziges Objekt, das mit dem Aufruf von delete test wieder gelöscht wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021794</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:27:57 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:33:59 GMT]]></title><description><![CDATA[<p>Der operator= liefert immer eine Referenz der Klasse zurück. Zudem brauchst du einen operator= nur wenn du einen Zeiger in der Klasse hast. Der Rückgabewert von operator= ist letztendlich immer eine Referenz auf *this:</p>
<pre><code class="language-cpp">Klasse1&amp; Klasse1::operator= (const Klasse1&amp; ref)
{
    if (this == &amp;ref) return *this;

    // Wiese allen Datenelementen einen Wert zu:
    obj = ref.obj;

    return *this;
}
</code></pre>
<p>Wobei du hier noch operator= als friend von Klasse1 deklarieren musst. Wenn du nur den Inhalt eines Zeigers kopieren willst und nicht eine ganze Liste (wo noch einiges mehr nötig ist um eine tiefe Kopie zu erreichen), geht das so:</p>
<pre><code class="language-cpp">*pObj = *ref.pObj;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1021801</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021801</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:33:59 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:40:52 GMT]]></title><description><![CDATA[<p>Vellas schrieb:</p>
<blockquote>
<p>Zudem brauchst du einen operator= nur wenn du einen Zeiger in der Klasse hast.</p>
</blockquote>
<p>&lt;klugscheißen&gt;<br />
Ist nicht ganz korrekt. Gilt nur für den Fall, daß du wirklich ein Deep-Copy brauchst.<br />
&lt;/klugscheißen&gt;</p>
<p>Vellas schrieb:</p>
<blockquote>
<p>Wobei du hier noch operator= als friend von Klasse1 deklarieren musst.</p>
</blockquote>
<p>Nö! Komplett überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021803</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021803</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:40:52 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:47:32 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>Nö! Komplett überflüssig.</p>
</blockquote>
<p>Doch, weil ich im operator= auf ein private-Element (obj) der Klasse zugreife. Könnte man aber natürlich dadurch umgehen, wenn es für dieses Objekt eine get-Methode gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021815</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021815</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:47:32 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:49:16 GMT]]></title><description><![CDATA[<p>Vellas schrieb:</p>
<blockquote>
<p>Z2 schrieb:</p>
<blockquote>
<p>Nö! Komplett überflüssig.</p>
</blockquote>
<p>Doch, weil ich im operator= auf ein private-Element (obj) der Klasse zugreife.</p>
</blockquote>
<p>Trotzdem Schwachsinn - operator= ist immer Member seiner Klasse, also hat er automatisch alle nötigen Rechte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021817</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021817</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:49:16 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:51:00 GMT]]></title><description><![CDATA[<p>Ops, stimmt. Ich habe an Operatoren allgemein gedacht als ich das schrieb. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021820</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021820</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 15:53:29 GMT]]></title><description><![CDATA[<p>Du rufst von einer Memberfunktion der Klasse1 eine public Memberfunktion eines Datenmembers von Klasse1 auf. Dazu ist keine friend-Deklaration notwendig.</p>
<p>Edit: zu spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021822</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Wed, 22 Mar 2006 15:53:29 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Wed, 22 Mar 2006 16:02:58 GMT]]></title><description><![CDATA[<blockquote>
<p>Vellas schrieb:</p>
<p>Zudem brauchst du einen operator= nur wenn du einen Zeiger in der Klasse hast.</p>
<p>&lt;klugscheißen&gt;<br />
Ist nicht ganz korrekt. Gilt nur für den Fall, daß du wirklich ein Deep-Copy brauchst.<br />
&lt;/klugscheißen&gt;</p>
</blockquote>
<p>&lt;klügerscheißen&gt;Wenn der Default Assignment Op nicht zureicht oder nicht verfügbar ist&lt;klügerscheißen&gt;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1021846</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1021846</guid><dc:creator><![CDATA[peterchen]]></dc:creator><pubDate>Wed, 22 Mar 2006 16:02:58 GMT</pubDate></item><item><title><![CDATA[Reply to Zuweisungsoperator für &amp;quot;tiefe Kopien&amp;quot;?! on Thu, 23 Mar 2006 11:21:49 GMT]]></title><description><![CDATA[<p>Z2 schrieb:</p>
<blockquote>
<p>Du rufst von einer Memberfunktion der Klasse1 eine public Memberfunktion eines Datenmembers von Klasse1 auf. Dazu ist keine friend-Deklaration notwendig.</p>
<p>Edit: zu spät <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
</blockquote>
<p>Ja, habe aber auch das Klasse1:: übersehen, weil ichs nur kopiert habe zum umschreiben.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Schwachsinn sicher nit, ein einfacher Hinweis wo mein Fehler lag hätte gereicht. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1022281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1022281</guid><dc:creator><![CDATA[Vellas]]></dc:creator><pubDate>Thu, 23 Mar 2006 11:21:49 GMT</pubDate></item></channel></rss>