<?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[Objekte kopieren]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir ein Objekt auf dem heap erstellt.</p>
<pre><code class="language-cpp">class Foo {

//...

};

Foo *obj0;

obj0 = new Foo();
</code></pre>
<p>Kann ich so ein Objekt nur klonen, indem ich einen Kopierkonstruktor verwende oder geht das auch eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/273929/objekte-kopieren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 21:44:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/273929.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 15 Sep 2010 17:27:51 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 17:27:51 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe mir ein Objekt auf dem heap erstellt.</p>
<pre><code class="language-cpp">class Foo {

//...

};

Foo *obj0;

obj0 = new Foo();
</code></pre>
<p>Kann ich so ein Objekt nur klonen, indem ich einen Kopierkonstruktor verwende oder geht das auch eleganter?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953078</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953078</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 17:27:51 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 17:57:12 GMT]]></title><description><![CDATA[<p>Was meinst du mit eleganter?</p>
<p>Kopierkonstruktoren sind ja genau dafür da, um Kopien zu erstellen. Was willst du da noch eleganter machen?</p>
<p>Wenn du schaust, dass <code>Foo</code> selbst für jedes Objekt, dass es enthält einen anständigen Kopierkonstruktor hat, dann musst du für <code>Foo</code> gar nichts mehr machen. Da reicht dann der Compiler generierte. Eleganter als das kannst du es nicht machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953095</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953095</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 15 Sep 2010 17:57:12 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:12:55 GMT]]></title><description><![CDATA[<p>ok, ich habe mir da mal einen kopierkonstruktor erstellt.</p>
<pre><code class="language-cpp">class Foo {

protected:
  bool is_active;

public:
  Foo(const Foo &amp;obj);

};

Foo::Foo(const Foo &amp;obj) {

obj.is_active = is_active;

}
</code></pre>
<pre><code>assignment of data-member 'Foo::is_active' in read-only structure
</code></pre>
<p>wie kann ich denn so einen bool-Wert kopieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953101</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953101</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:12:55 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:17:56 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Foo::Foo(const Foo &amp;obj) {

  is_active = obj.is_active;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953102</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953102</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:17:56 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:23:02 GMT]]></title><description><![CDATA[<p>Das war ja der Punkt, den ich angesprochen habe. So etwas musst du gar nicht machen, weil das der generierte Kopierkonstruktor selbst macht. Erst wenn so eine Zuweisung nicht dem entspricht, was du unter Kopie verstehst (für gewöhnlich Zeiger, welche Speicher verwalten), dann musst du den selbst implementieren. Ansonsten reicht der generierte (Wenn du einen Smart Pointer benutzt erledigt der das kopieren für dich).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953106</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953106</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:23:02 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:31:03 GMT]]></title><description><![CDATA[<p>Und wenn du Konstruktoren (allgemein, nicht nur Kopierkonstruktor) implementierst, dann benutze doch die Initialisierungsliste anstelle von Zuweisungen.</p>
<pre><code class="language-cpp">Foo::Foo(const Foo &amp;obj)
: is_active(obj.is_active)
{
    // Rumpf ist leer
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953118</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:31:03 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:40:30 GMT]]></title><description><![CDATA[<p>Dazu ist noch die Regel der &quot;großen Drei&quot; erwähnenswert, die besagt dass wenn eins der drei( Kopierkonstruktor, Zuweisungsoperator, Destruktor ) benötigt wird in der Regel auch die anderen beiden erforderlich sind. Ausnahme ist der virtuelle Destruktor der für die Polymorphie benötigt wird.</p>
<p>Wie schon gesagt wurde reicht eg meistens die compilergenerierten Versionen der drei außer deine Klasse enthält zum Beispiel Zeiger.</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953127</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:40:30 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:44:21 GMT]]></title><description><![CDATA[<p>wie sieht das jetzt aber bei einer Mehrfachvererbung aus?</p>
<p>Ich habe jetzt mal in der Basisklasse den Kopierkonstruktor reingemacht und dann auch in jeder vererbten Klasse einen Kopierkonstruktor erstellt.</p>
<pre><code class="language-cpp">Foo::Foo(const Foo &amp;obj) : Bar(obj) {

}
</code></pre>
<p>Allerdings bekomme ich da dann immer die Fehlermeldung, dass der Konstruktor mehrfach deklariert wurde, da ich ja hier etwa falsch gemacht habe, allerdings weiß ich da gerade nicht was genau.</p>
<p>Darf ich da den Kopierkonstruktor der Basisklasse bzw. Elternklasse nicht mehr mit aufrufen oder wie genau muss ich das machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953129</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953129</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:44:21 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:47:24 GMT]]></title><description><![CDATA[<p>fr33g schrieb:</p>
<blockquote>
<p>Ausnahme ist der virtuelle Destruktor der für die Polymorphie benötigt wird.</p>
</blockquote>
<p>Wobei es hier auch sinnvoll ist, Kopierkonstruktor und Zuweisungsoperator zu deklarieren – jedoch ohne Definition im <code>private</code> -Bereich, sodass sie nicht versehentlich aufgerufen werden.</p>
<p>fr33g schrieb:</p>
<blockquote>
<p>Wie schon gesagt wurde reicht eg meistens die compilergenerierten Versionen der drei außer deine Klasse enthält zum Beispiel Zeiger.</p>
</blockquote>
<p>Auch Zeiger sind nur ein Problem, wenn sie das verwiesene Objekt besitzen. Wenn sie auf ein unabhängiges Objekt ausserhalb zeigen, tun die eingebauten Methoden das Richtige.</p>
<p>anno schrieb:</p>
<blockquote>
<p>Allerdings bekomme ich da dann immer die Fehlermeldung, dass der Konstruktor mehrfach deklariert wurde, da ich ja hier etwa falsch gemacht habe, allerdings weiß ich da gerade nicht was genau.</p>
</blockquote>
<p>Zeig uns ein <strong>minimales</strong> aber <strong>vollständiges</strong> Codebeispiel, das den gezeigten Fehler immer noch repräsentiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953133</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953133</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:47:24 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 18:53:15 GMT]]></title><description><![CDATA[<p>Hier ist mal ein Vererbungsbeispiel.</p>
<pre><code class="language-cpp">//Basisklasse
class Foo {

protected:
bool is_active_foo;

public:
Foo(const Foo &amp;obj);

};

Foo::Foo(const Foo &amp;obj) {

}

//1. Vererbung
class Bar : public Foo {

protected:
bool is_active_bar;

public:
Bar(const Foo &amp;obj);

};

Bar::Bar(const Bar &amp;obj) :
 		 Foo(obj) {

}

//2. Vererbung
class Top : public Bar {

protected:
bool is_active_bar;

public:
Top(const Foo &amp;obj);

};

Top::Top(const Top &amp;obj) :
 		 Bar(obj) {

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953136</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953136</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 18:53:15 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 19:23:14 GMT]]></title><description><![CDATA[<p>Bei den abgeleiteten Kopierkonstruktoren stimmen die Funktionsdeklarationen nicht mit den -definitionen überein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953145</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 15 Sep 2010 19:23:14 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 19:29:11 GMT]]></title><description><![CDATA[<p>Du müsstest die Parameter der Deklaration so ändern dass sie mit denen deiner Definitionen übereinstimmen, sprich ihnen eine const Referenz auf den Typ des abgeleiteten Objekts geben und nicht auf die Basis.</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953148</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Wed, 15 Sep 2010 19:29:11 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 19:38:13 GMT]]></title><description><![CDATA[<p>Das hätte er auch selbst rausfinden können. <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/1953151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953151</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 15 Sep 2010 19:38:13 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 19:41:37 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das hätte er auch selbst rausfinden können. <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 da hast du natürlich recht, aber ich dachte da er mit der Compilermeldung wohl nicht klar kam und er es hier gepostet hat erklär ichs auch kurz genau, nicht dass er die Definitionen abändert <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="😃"
    /> <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>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953152</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Wed, 15 Sep 2010 19:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 20:59:35 GMT]]></title><description><![CDATA[<p>Also das Kopieren der Klassen funktioniert soweit mal. Thx für die Hilfe.</p>
<p>Allerdings habe ich auch Zeiger innerhalb der Klasse.</p>
<pre><code class="language-cpp">//2. Vererbung
class Top : public Bar {

protected:
EineAndereKlasse *obj0;
bool is_active_bar;

public:
Top(const Foo &amp;obj);

};
</code></pre>
<p>Diese ist einfach eine seperate Klasse die ich eingebunden habe. so wie es aussieht wird diese aber nicht mit kopiert. Wie bekomme ich das denn bei dieser hin, sie mit zu kopieren im Kopierkonstruktor?</p>
<pre><code class="language-cpp">EineAndereKlasse *obj0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953178</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953178</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 20:59:35 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 21:40:44 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Top(const Foo &amp;obj);
</code></pre>
<p>Das ist ja immer noch falsch. Lies nochmals meinen und fr33gs Beitrag. Und rücke bitte deinen Code ein, dann ist er um einiges übersichtlicher.</p>
<p>Brauchst du wirklich Zeiger, oder geht auch ein</p>
<pre><code class="language-cpp">EineAndereKlasse obj0;
</code></pre>
<p>?</p>
<p>Falls du besitzende Zeiger benötigst (z.B. um Abhängigkeiten zu verringern), kommt es natürlich drauf an, wie ihr Speicher angefordert wurde. Da dies höchstwahrscheinlich mit <code>new</code> erfolgte, sollte der Kopierkonstruktor ebenfalls ein <code>new</code> verwenden:</p>
<pre><code class="language-cpp">Top::Top(const Top&amp; origin)
: obj0(new EineAndereKlasse(*origin.obj0))
// hier andere Member kopieren
{
}
</code></pre>
<p>Der Destruktor muss dann mit <code>delete</code> freigeben und den Zuweisungsoperator implementierst du am besten mit <em>Copy-and-Swap</em> (such mal danach, auf Wikibooks ist das Idiom z.B. erklärt).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953192</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953192</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 15 Sep 2010 21:40:44 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Wed, 15 Sep 2010 22:24:47 GMT]]></title><description><![CDATA[<p>naja, dann braucht der Zeiger bzw. die Klasse, der in der Klasse erstellt wurde ja auch einen Kopierkonstruktor, ist das richtig?</p>
<pre><code class="language-cpp">EineAndereKlasse *obj0;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1953204</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953204</guid><dc:creator><![CDATA[anno]]></dc:creator><pubDate>Wed, 15 Sep 2010 22:24:47 GMT</pubDate></item><item><title><![CDATA[Reply to Objekte kopieren on Thu, 16 Sep 2010 04:39:38 GMT]]></title><description><![CDATA[<p>Ich habe irgendwie dieses dumpfe Gefühl, dass du das alles noch nicht so wirklich verstehst <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>
<p>Schau mal der Compiler generiert immer automatisch einen Kopierkonstruktor, Zuweisungsoperator und Destruktor für eine erstellte Klasse, außer du definierst selber diese drei, dann macht es der Compiler nicht.</p>
<p>So wenn jetzt deine Klasse einen besitzenden Zeiger auf ein anderes Objekt enthält und den Speicher mit new anfordert, dann musst du dies auch im Kopierkonstruktor und Zuweisungsoperator definieren. Zusätzlich musst du den Speicher auch im Desktruktor mit delete freigeben, genauso musst du beim Zuweisungsoperator dann ja auch die alten Werte löschen.</p>
<p>So wenn jetzt dein Zeiger auf ne andere von dir erstellte Klasse zeigt, diese jedoch keine besitzenden Zeiger enthält, dann reichen eigentlich die vom Compiler generierten Varianten aus, so dass du da nichts machen musst.</p>
<p>Hast du das verstanden?</p>
<p>Lg freeG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1953220</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1953220</guid><dc:creator><![CDATA[fr33g]]></dc:creator><pubDate>Thu, 16 Sep 2010 04:39:38 GMT</pubDate></item></channel></rss>