<?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[Rückgabeproblem]]></title><description><![CDATA[<p>Hi,</p>
<p>Wieso funktioniert folgendes nicht?:</p>
<pre><code class="language-cpp">const String String::operator+(const String &amp;string2) const
{
   ...
}

const String String::operator+=(const String &amp;string2)
{
	return(*this = *this + string2);
}
</code></pre>
<p>Es wird dann irgendein willkürlicher String ausgegeben</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/289325/rückgabeproblem</link><generator>RSS for Node</generator><lastBuildDate>Wed, 19 Aug 2026 05:43:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/289325.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 02 Jul 2011 15:19:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 15:19:09 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>Wieso funktioniert folgendes nicht?:</p>
<pre><code class="language-cpp">const String String::operator+(const String &amp;string2) const
{
   ...
}

const String String::operator+=(const String &amp;string2)
{
	return(*this = *this + string2);
}
</code></pre>
<p>Es wird dann irgendein willkürlicher String ausgegeben</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087752</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087752</guid><dc:creator><![CDATA[Jeffson]]></dc:creator><pubDate>Sat, 02 Jul 2011 15:19:09 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 15:24:42 GMT]]></title><description><![CDATA[<p>Hast du denn mal im Debugger verfolgt, was passiert? Ansonsten kann es zu viele Unklarheiten in der Implementation von operator+ und operator= geben, die dir einen Strich durch die Rechnung machen könnten.</p>
<p>PS: Normalerweise kenne ich die Lösung andersrum - operator+ wird auf der Basis von operator+= implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087757</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087757</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 02 Jul 2011 15:24:42 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 16:00:10 GMT]]></title><description><![CDATA[<p>Hast du den Zweisungsoperator korrekt implementiert (wenn du es überhaupt selbst gemacht hast)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087767</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087767</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sat, 02 Jul 2011 16:00:10 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 17:42:07 GMT]]></title><description><![CDATA[<p>Es sieht insgesamt so aus:</p>
<pre><code class="language-cpp">class String
{
	....
        public:
	// Operator-Methode
	const String operator+(const String &amp;) const;
	const String operator+=(const String &amp;);
};
....
const String String::operator+(const String &amp;string2) const
{
	unsigned int len2 = len + string2.len;
	char *zeichen_tmp = new char[len2 +1];
	memset(zeichen_tmp, '\0', sizeof(zeichen_tmp));
	cout &lt;&lt; &quot;strlen(zeichen) == &quot; &lt;&lt; strlen(zeichen) &lt;&lt; endl;
	strncpy(zeichen_tmp, zeichen, strlen(zeichen));
	strncat(zeichen_tmp, string2.zeichen, strlen(string2.zeichen));

	String str_erg(zeichen_tmp);

	return(str_erg);
}

const String String::operator+=(const String &amp;string2)
{
	*this = this-&gt;operator+(string2);

	return(*this);
}
</code></pre>
<p>Wo ist hier der Bug?</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087823</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087823</guid><dc:creator><![CDATA[Jeffson]]></dc:creator><pubDate>Sat, 02 Jul 2011 17:42:07 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 17:43:16 GMT]]></title><description><![CDATA[<p>Minimales kompilierbares Beispiel bitte!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087824</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087824</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Sat, 02 Jul 2011 17:43:16 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 17:54:20 GMT]]></title><description><![CDATA[<p>Zeig doch mal noch den Konstruktor für char* und den Zuweisungs-Operator. Auf den ersten Blick sehe ich auf jeden Fall ein potentielles Speicherleck (wer gibt den Speicher hinter &quot;zeichen_tmp&quot; wieder frei) und ernsthaftere Probleme, wenn len nicht immer korrekt aktualisiert wurde.</p>
<p>PS: Ich wiederhole mich noch mal: es ist vermutlich einfacher, wenn du die Operatoren andersherum aufeinander beziehst:</p>
<pre><code class="language-cpp">String&amp; String::operator+=(const String&amp; rhs)
{
  ...
  return *this;
}

//das braucht noch nicht mal eine Methode der Klasse sein:
String operator+(const String&amp; lhs, const String&amp; rhs)
{
  String tmp = lhs;
  return tmp+=rhs;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2087833</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087833</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Sat, 02 Jul 2011 17:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 18:31:31 GMT]]></title><description><![CDATA[<p>Enthält deine Klasse möglicherweise so etwas:</p>
<pre><code class="language-cpp">class String
{
private:
  char* zeichen;
public:
  String( char* z ) { zeichen = z;}
  ~String() { delete[] zeichen; }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2087858</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087858</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:31:31 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Sat, 02 Jul 2011 18:44:50 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>So etwas ähnliches. Wobei bei mir der Konstruktor durchaus umfangreicher ist. Es müsste doch so sein, dass der Destruktor eigentlich Zeichenketten in den lokal angelegten Objekten löscht, doch bei mir ist das nicht der Fall. Komisch.. In dem Buch C++ von A bis Z sind ja lauter Fehler drinnen. Das ist der Wahnsinn. Er gibt als Rückgabewert &quot;String&quot; an und gibt letztendlich &quot;char *&quot; zurück... Wahnsinn</p>
<p>lg</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2087863</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2087863</guid><dc:creator><![CDATA[Jeffson]]></dc:creator><pubDate>Sat, 02 Jul 2011 18:44:50 GMT</pubDate></item><item><title><![CDATA[Reply to Rückgabeproblem on Mon, 04 Jul 2011 07:15:31 GMT]]></title><description><![CDATA[<p>Jeffson schrieb:</p>
<blockquote>
<p>Hi,<br />
...<br />
Er gibt als Rückgabewert &quot;String&quot; an und gibt letztendlich &quot;char *&quot; zurück... Wahnsinn<br />
lg</p>
</blockquote>
<p>Ich nehme JW ja nur ungern in Schutz, aber das ist gültiges C++, wenn es einen Konstruktor der Klasse String gibt, der einen char* erwartet. In diesem Fall wird der Konstruktor implizit aufgerufen und ein temporäres String Objekt zurückgegeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2088488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2088488</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Mon, 04 Jul 2011 07:15:31 GMT</pubDate></item></channel></rss>