<?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[Klasse operator= sich selbst löschen?]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade eine Klasse zu erstellen welche hinter sich aufräumt.<br />
Ziel ist es die (globale) Variable &quot;stadt&quot; einfach &quot;überschreiben&quot; zu können ohne vorher delete ausrufen zu müssen. Mir ist klar das er Code so nicht gehen kann, weil mein Verstand mir sagt &quot;Wenn ich in einer Member-funktion bin, kann ich diese Klasse nicht löschen&quot;. Aber vielleicht gibt es ja doch einen weg. Der operator-&gt; ist dafür da, das man auch Zugriff hat als währe stadt ein Pointer.</p>
<pre><code>class City
{
protected:
	City *ptr;
	std::wstring name;

public:
	City(std::wstring name) : ptr(this)
	{
		this-&gt;name = name;
	}

	City* operator-&gt;()
	{
		return this;
	};

	City&amp; operator=(City &amp;ref)
	{
		std::wcout &lt;&lt; &quot;operator=\n&quot;;
		if (this != &amp;ref)
		{
			std::wcout &lt;&lt; &quot;operator= ... if ...\n&quot;;

			// Alle möglichen aufräumarbeiten + speicher frei geben
			delete this-&gt;ptr;

			return ref;
		}
		else
		{
			std::wcout &lt;&lt; &quot;operator= ... same ...\n&quot;;
		}

		std::wcout &lt;&lt; &quot;operator= ... return ...\n&quot;;
		return *this;
	};

	const std::wstring getName()
	{
		return this-&gt;name;
	}
};

	// 1. Test OK
	City stadt= City(std::wstring(_T(&quot;berlin&quot;)));

	std::wcout &lt;&lt; &quot;Stadt: &quot; &lt;&lt; stadt-&gt;getName() &lt;&lt; &quot;\n&quot;;

	// 2. Test, OK
	stadt = stadt;

	// 3. Test, Error
	stadt = City(std::wstring(_T(&quot;köln&quot;)));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/333987/klasse-operator-sich-selbst-löschen</link><generator>RSS for Node</generator><lastBuildDate>Sun, 26 Apr 2026 03:54:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/333987.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 15 Aug 2015 09:04:49 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:04:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich versuche gerade eine Klasse zu erstellen welche hinter sich aufräumt.<br />
Ziel ist es die (globale) Variable &quot;stadt&quot; einfach &quot;überschreiben&quot; zu können ohne vorher delete ausrufen zu müssen. Mir ist klar das er Code so nicht gehen kann, weil mein Verstand mir sagt &quot;Wenn ich in einer Member-funktion bin, kann ich diese Klasse nicht löschen&quot;. Aber vielleicht gibt es ja doch einen weg. Der operator-&gt; ist dafür da, das man auch Zugriff hat als währe stadt ein Pointer.</p>
<pre><code>class City
{
protected:
	City *ptr;
	std::wstring name;

public:
	City(std::wstring name) : ptr(this)
	{
		this-&gt;name = name;
	}

	City* operator-&gt;()
	{
		return this;
	};

	City&amp; operator=(City &amp;ref)
	{
		std::wcout &lt;&lt; &quot;operator=\n&quot;;
		if (this != &amp;ref)
		{
			std::wcout &lt;&lt; &quot;operator= ... if ...\n&quot;;

			// Alle möglichen aufräumarbeiten + speicher frei geben
			delete this-&gt;ptr;

			return ref;
		}
		else
		{
			std::wcout &lt;&lt; &quot;operator= ... same ...\n&quot;;
		}

		std::wcout &lt;&lt; &quot;operator= ... return ...\n&quot;;
		return *this;
	};

	const std::wstring getName()
	{
		return this-&gt;name;
	}
};

	// 1. Test OK
	City stadt= City(std::wstring(_T(&quot;berlin&quot;)));

	std::wcout &lt;&lt; &quot;Stadt: &quot; &lt;&lt; stadt-&gt;getName() &lt;&lt; &quot;\n&quot;;

	// 2. Test, OK
	stadt = stadt;

	// 3. Test, Error
	stadt = City(std::wstring(_T(&quot;köln&quot;)));
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2463931</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463931</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:04:49 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:08:46 GMT]]></title><description><![CDATA[<p>Das geht schon und wird auch gemacht, aber eigentlich sollte man das alte Objekt (nicht Klasse) nicht löschen, sondern mit neuen Werten überschreiben, dann entstehen auch keine Speicherlecks. Wenn du einen nicht trivialen Destruktor hast, würde ich den = Operator spontan als private deklarieren, aber da wäre glaube die Meinung von jemanden erfahreren gefragt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463932</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463932</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:08:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:12:03 GMT]]></title><description><![CDATA[<p>wenn ich ihn private mache, kann ich ja nicht mehr irgendwo stadt = XY machen.<br />
Aber das ist auch eine Idee, einfach das Objekt leer machen und neu beschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463933</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463933</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:12:03 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:18:46 GMT]]></title><description><![CDATA[<p>Da hat man doch dann den Destruktor im Prinzip 2 mal implementiert? Oder kann man ihn manuell aus der Klasse aufrufen?</p>
<p>Du bekommt in der letzen Zeile glaube auch den Fehler, weil du genau das versuchst: das Objekt zu zerstören in dem Objekt selbst. Aber helfen würde es schon, wenn du die genaue Fehlermeldung postest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463934</guid><dc:creator><![CDATA[Bengo]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:18:46 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:30:43 GMT]]></title><description><![CDATA[<p>Ein Objekt, das nicht mit new erzeugt wurde, darf auch nicht mit delete zerstört werden. Das delete hat da in operator= also nichts verloren.</p>
<p>Ein Zuweisungsoperator sollte etwa so aussehen:</p>
<pre><code>City&amp; operator=(const City&amp; rhs)
{
    if (this!=&amp;rhs)name=rhs.name;
    return *this;
}
</code></pre>
<p>Erfüllt ptr eigentlich eine spezielle Funktion?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463937</guid><dc:creator><![CDATA[;abc]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:30:43 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:32:25 GMT]]></title><description><![CDATA[<p>operator= ist ja nicht der destructor, man könnte das z.B. ja auch verwenden um das Objekt mit Daten zu füllen.</p>
<p>_BLOCK_TYPE_IS_VAILD(pHead-&gt;nBlockUse)</p>
<p>Ich schrieb bereits das es mir einleuchtet dass ich das Object nicht in dem Objekt selber löschen kann. Darum war ja meine frage wie man das lösen würde.</p>
<p>Ich dachte sogar das ich mit delete Speicherleaks verhinder <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/1180">@abc</a>:</p>
<p>Nein hat er nicht, aber würde genau das jetzt nicht ein Speicherleak verursachen. Weil eben die alten Daten nicht gelöscht werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463938</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463938</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:32:25 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:36:34 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>Weil eben die alten Daten nicht gelöscht werden?</p>
</blockquote>
<p>Welche alten Daten? Es handelt sich nach wie vor um dasselbe City-Objekt, egal wie oft du operator= aufrufst. Falls du name meinst: wie jede andere Klasse hat auch std::wstring dafür zu sorgen, dass eine Neuzuweisung kein Speicherleck verursacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463939</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463939</guid><dc:creator><![CDATA[;abc]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:36:34 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:38:30 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;

class City
{
protected:
    std::wstring name;

public:
    City(std::wstring name) : name(name){}

    std::wstring getName() const
    {
        return name;
    }
};

int main()
{
    City stadt= City(L&quot;berlin&quot;);

    std::wcout &lt;&lt; &quot;Stadt: &quot; &lt;&lt; stadt.getName() &lt;&lt; &quot;\n&quot;;

    stadt = stadt;

    stadt = City(L&quot;köln&quot;);
    std::wcout &lt;&lt; &quot;Stadt: &quot; &lt;&lt; stadt.getName() &lt;&lt; &quot;\n&quot;;
}
</code></pre>
<p>Dann definiere mal, warum du es nicht so machst, dann bekommst du möglicherweise eine hilfreiche Antwort.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463940</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463940</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:38:30 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:38:44 GMT]]></title><description><![CDATA[<p>Naja, die Klasse ist jetzt sehr simpel gezeigt, sie ist größer, und erhält im laufe der Zeit viel mehr Daten druch setMethoden. Ich wollte delete nehmen um einfach alle Werte zu löschen und ein komplett neues sauberes Object zu erhalten. Andernfalls muss ich jeden wert wieder zurück setzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463941</guid><dc:creator><![CDATA[MrSpoocy]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:38:44 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:43:26 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>Naja, die Klasse ist jetzt sehr simpel gezeigt, sie ist größer, und erhält im laufe der Zeit viel mehr Daten druch setMethoden. Ich wollte delete nehmen um einfach alle Werte zu löschen und ein komplett neues sauberes Object zu erhalten. Andernfalls muss ich jeden wert wieder zurück setzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
</blockquote>
<p>Warum sollte es nötig sein, etwas zurückzusetzen? Es werden alle Werte der neuen Stadt kopiert!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463942</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463942</guid><dc:creator><![CDATA[manni66]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:43:26 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse operator= sich selbst löschen? on Sat, 15 Aug 2015 09:47:28 GMT]]></title><description><![CDATA[<p>MrSpoocy schrieb:</p>
<blockquote>
<p>Naja, die Klasse ist jetzt sehr simpel gezeigt, sie ist größer, und erhält im laufe der Zeit viel mehr Daten druch setMethoden. Ich wollte delete nehmen um einfach alle Werte zu löschen und ein komplett neues sauberes Object zu erhalten. Andernfalls muss ich jeden wert wieder zurück setzen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
</blockquote>
<p>operator= soll das Objekt nicht zurücksetzen, sondern muss die Attribute des übergebenen Objekts kopieren (name usw.).<br />
Die gute Nachricht ist, dass du das in aller Regel nicht selbst machen musst, denn der Compiler erzeugt einen passenden operator= wenn du keine eigene Definition angibst.<br />
Wenn du ihn also einfach ganz weglässt, wirst du sehen, dass dein Code nun korrekt funktioniert. Und es gibt auch keine Speicherlecks.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2463943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2463943</guid><dc:creator><![CDATA[;abc]]></dc:creator><pubDate>Sat, 15 Aug 2015 09:47:28 GMT</pubDate></item></channel></rss>