<?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[richtig Copy-Konstruktor schreiben]]></title><description><![CDATA[<p>Hi,</p>
<p>eine Klasse hat ein Attribut</p>
<pre><code class="language-cpp">char* str;
</code></pre>
<p>Wie würde man dafür einen Copy-Konstruktor schreiben?</p>
<p>so??</p>
<pre><code class="language-cpp">T(const&amp; T t)
{
    str = new char[32];
    strcpy(str, t.str);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/163684/richtig-copy-konstruktor-schreiben</link><generator>RSS for Node</generator><lastBuildDate>Sun, 13 Sep 2026 05:08:19 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/163684.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 31 Oct 2006 22:51:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Tue, 31 Oct 2006 22:51:57 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>eine Klasse hat ein Attribut</p>
<pre><code class="language-cpp">char* str;
</code></pre>
<p>Wie würde man dafür einen Copy-Konstruktor schreiben?</p>
<p>so??</p>
<pre><code class="language-cpp">T(const&amp; T t)
{
    str = new char[32];
    strcpy(str, t.str);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1165830</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1165830</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Tue, 31 Oct 2006 22:51:57 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Tue, 31 Oct 2006 23:55:05 GMT]]></title><description><![CDATA[<p>Wenn deine Klasse T ist sieht der Copy C'tor so aus:</p>
<pre><code class="language-cpp">T( const T&amp; other )
{
  // ...
}
</code></pre>
<p>Beim kopieren musst du darauf achten das keine Memoryleaks entstehen (bei Exceptions oder Selbstzuweisung).</p>
<p>Eine Idee die Selbstzuweisung zu unterbinden ist folgende:</p>
<pre><code class="language-cpp">T( const T&amp; other )
{
  if ( this == &amp;other )
    return;

  // ...
}
</code></pre>
<p>Andererseits kann man sich diese Abfrage auch sparen:</p>
<pre><code class="language-cpp">T( const T&amp; other )
{
  char* tmp = str;
  str = new char[ 32 ];
  strcpy( str, other.str );
  delete [] tmp; // speicher freigeben ist wichtig
}
</code></pre>
<p>Wobei du darauf achten solltest das str gültig oder NULL ist. Außerdem solltest du evtl die Länge des Strings von &quot;other&quot; berücksichtigen.</p>
<p>Und um sich den ganzen ärger zu sparen könntest du einfach std::string verwenden statt char*.</p>
<p>grüße</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1165848</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1165848</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Tue, 31 Oct 2006 23:55:05 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Wed, 01 Nov 2006 00:01:14 GMT]]></title><description><![CDATA[<p>David_pb schrieb:</p>
<blockquote>
<p>Eine Idee die Selbstzuweisung zu unterbinden ist folgende:</p>
<pre><code class="language-cpp">T( const T&amp; other )
{
  if ( this == &amp;other )
    return;

  // ...
}
</code></pre>
</blockquote>
<p>Zuweisung ist was anderes als Kopie. Eine Selbstkopie gibt es nicht, so ein Test ist überflüssig.</p>
<p>@sly: Die Frage ist im Allgemeinen nicht zu beantworten, da du nicht schreibst, welche Assoziation zwischen str und deiner Klasse besteht. Nehmen wir mal an, dass die Klasse str besitzt. Dann ist dein Ansatz schon fast gut, allerdings solltest du dafür sorgen, dass dein String auch in den allozierten Speicher reinpasst. Pauschal 32 ist irgendwann zu wenig und ein potentielles Sicherheitsleck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1165850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1165850</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 01 Nov 2006 00:01:14 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Wed, 01 Nov 2006 00:32:59 GMT]]></title><description><![CDATA[<p>Bashar schrieb:</p>
<blockquote>
<p>David_pb schrieb:</p>
<blockquote>
<p>Eine Idee die Selbstzuweisung zu unterbinden ist folgende:</p>
<pre><code class="language-cpp">T( const T&amp; other )
{
  if ( this == &amp;other )
    return;

  // ...
}
</code></pre>
</blockquote>
<p>Zuweisung ist was anderes als Kopie. Eine Selbstkopie gibt es nicht, so ein Test ist überflüssig.</p>
<p>@sly: Die Frage ist im Allgemeinen nicht zu beantworten, da du nicht schreibst, welche Assoziation zwischen str und deiner Klasse besteht. Nehmen wir mal an, dass die Klasse str besitzt. Dann ist dein Ansatz schon fast gut, allerdings solltest du dafür sorgen, dass dein String auch in den allozierten Speicher reinpasst. Pauschal 32 ist irgendwann zu wenig und ein potentielles Sicherheitsleck.</p>
</blockquote>
<p>Arg, hast natürlich recht... <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="😮"
    /> Hm, is das spät heute! :-))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1165855</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1165855</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Wed, 01 Nov 2006 00:32:59 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Wed, 01 Nov 2006 00:34:04 GMT]]></title><description><![CDATA[<p>Nach Möglichkeiten sollte man die Resourcen-Belegung/Freigabe in einzelne Klassen aufteilen. Das erleichtert die Exception-Sicherheit um einiges.</p>
<p>Für Strings gibt es (wie schon gesagt wurde) zB std::string</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1165856</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1165856</guid><dc:creator><![CDATA[rüdiger]]></dc:creator><pubDate>Wed, 01 Nov 2006 00:34:04 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Wed, 01 Nov 2006 10:52:26 GMT]]></title><description><![CDATA[<p>[quote]Nehmen wir mal an, dass die Klasse str besitzt.[/qoute]<br />
Das ist der Fall.</p>
<blockquote>
<p>Dann ist dein Ansatz schon fast gut, allerdings solltest du dafür sorgen, dass dein String auch in den allozierten Speicher reinpasst. Pauschal 32 ist irgendwann zu wenig und ein potentielles Sicherheitsleck.</p>
</blockquote>
<p>das stimmt.</p>
<p>Wäre es so besser?</p>
<pre><code class="language-cpp">T(const&amp; T other)
{
    str = new char[strlen(other.str) + 1];
    strcpy(str, t.str);
}
</code></pre>
<blockquote>
<p>Und um sich den ganzen ärger zu sparen könntest du einfach std::string verwenden statt char*.</p>
</blockquote>
<p>Das würde ich auch gerne, allerdings verbietet mir die Vorgabe mit STL zu arbeiten. ( -&gt; low level Programmierung).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166070</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166070</guid><dc:creator><![CDATA[sly]]></dc:creator><pubDate>Wed, 01 Nov 2006 10:52:26 GMT</pubDate></item><item><title><![CDATA[Reply to richtig Copy-Konstruktor schreiben on Wed, 01 Nov 2006 14:28:49 GMT]]></title><description><![CDATA[<p>Ja, das könnte man so nehmen (eventuell müsstest du noch abfangen, daß other.str nicht NULL werden darf). Dazu benötigst du jetzt noch einen Zuweisungs-Operator (dort wird dann David's &quot;Schutz vor Selbstzuweisung&quot; wichtig) und einen Destruktor, der den Speicher freigibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1166285</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1166285</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 01 Nov 2006 14:28:49 GMT</pubDate></item></channel></rss>