<?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[Verständnisfrage]]></title><description><![CDATA[<p>Hallo, erst mal sorry für die Überschrift, aber mir ist tatsächlich kein besserer Titel zu dem Thema eingefallen. Ich demonstriere mein Problem mal eben anhand dieser Methoden :</p>
<pre><code>Array2D&amp; assign(Array2D a)		
	{
		swap(a);
		return *this;
	}

	void swap (Array2D&amp; a) {
		/*	
		SO AKTZEPTIERT DER COMPILER ALLES
		_________________________________
		size_t temp = zeilen;
		zeilen = a.zeilen;
		a.zeilen = temp;
		temp = spalten;
		spalten = a.spalten;
		a.spalten = temp;
		T* tmp = ptr;
		ptr = a.ptr;
		a.ptr = tmp;
		*/
		// DAS WÄRE &quot;meine Variante: &quot;
		zeilen = a.zeilen;
		spalten = a.spalten;
		T* tmp = ptr;
		ptr = a.ptr;
		a.ptr = tmp;
	}
	Array2D(const Array2D&amp; a)
		: zeilen(a.zeilen), spalten(a.spalten), ptr(new T[a.zeilen*a.spalten]) {
			const int ANZ = zeilen* spalten;
			for (size_t i=0; i&lt;ANZ; ++i) {
				ptr[i] = a.ptr[i];
			}
	}
	~Array2D() { delete [ ] ptr; }
</code></pre>
<p>Kann mir jemand erklären, wieso ich bei der Methode &quot;swap&quot; die Zeilen und die Spalten an das übergebene Objekt &quot;a&quot; zuweisen muss?<br />
Das a den Pointer von *this übergeben bekommen muss dient ja der &quot;Zerstörung&quot; des alten Speicherplatzes, aber wieso zur Hölle müssen die Zeilen und Spalten auch an &quot;a&quot; zugewiesen werden?<br />
Für den Destruktor ist das doch irrelevant, oder?!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326543/verständnisfrage</link><generator>RSS for Node</generator><lastBuildDate>Sun, 24 May 2026 23:55:49 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326543.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Jun 2014 14:41:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 14:41:23 GMT]]></title><description><![CDATA[<p>Hallo, erst mal sorry für die Überschrift, aber mir ist tatsächlich kein besserer Titel zu dem Thema eingefallen. Ich demonstriere mein Problem mal eben anhand dieser Methoden :</p>
<pre><code>Array2D&amp; assign(Array2D a)		
	{
		swap(a);
		return *this;
	}

	void swap (Array2D&amp; a) {
		/*	
		SO AKTZEPTIERT DER COMPILER ALLES
		_________________________________
		size_t temp = zeilen;
		zeilen = a.zeilen;
		a.zeilen = temp;
		temp = spalten;
		spalten = a.spalten;
		a.spalten = temp;
		T* tmp = ptr;
		ptr = a.ptr;
		a.ptr = tmp;
		*/
		// DAS WÄRE &quot;meine Variante: &quot;
		zeilen = a.zeilen;
		spalten = a.spalten;
		T* tmp = ptr;
		ptr = a.ptr;
		a.ptr = tmp;
	}
	Array2D(const Array2D&amp; a)
		: zeilen(a.zeilen), spalten(a.spalten), ptr(new T[a.zeilen*a.spalten]) {
			const int ANZ = zeilen* spalten;
			for (size_t i=0; i&lt;ANZ; ++i) {
				ptr[i] = a.ptr[i];
			}
	}
	~Array2D() { delete [ ] ptr; }
</code></pre>
<p>Kann mir jemand erklären, wieso ich bei der Methode &quot;swap&quot; die Zeilen und die Spalten an das übergebene Objekt &quot;a&quot; zuweisen muss?<br />
Das a den Pointer von *this übergeben bekommen muss dient ja der &quot;Zerstörung&quot; des alten Speicherplatzes, aber wieso zur Hölle müssen die Zeilen und Spalten auch an &quot;a&quot; zugewiesen werden?<br />
Für den Destruktor ist das doch irrelevant, oder?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405248</guid><dc:creator><![CDATA[Cre]]></dc:creator><pubDate>Mon, 23 Jun 2014 14:41:23 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 14:59:31 GMT]]></title><description><![CDATA[<p>&quot;swap&quot; bedeutet &quot;tauschen&quot;.</p>
<pre><code class="language-cpp">int a = 3;
int b = 5;
std::swap(a,b);

// jetzt gilt: a == 5, b == 3)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405256</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405256</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jun 2014 14:59:31 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 15:09:28 GMT]]></title><description><![CDATA[<p>Lass das swap so wie es war und füge Deinen code ins assign ein und lass dort den Aufruf von swap weg <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="😉"
    /> Beim ptr lässt Du die Tauscherei natürlich dann auch weg <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>swap = tauschen<br />
assign = zuweisen</p>
<pre><code>Array2D&amp; assign(Array2D a)     
    {
        zeilen = a.zeilen;
        spalten = a.spalten;
        ptr = a.ptr;
        return *this;
    }

    void swap (Array2D&amp; a) {
        size_t temp = zeilen;
        zeilen = a.zeilen;
        a.zeilen = temp;
        temp = spalten;
        spalten = a.spalten;
        a.spalten = temp;
        T* tmp = ptr;
        ptr = a.ptr;
        a.ptr = tmp;
    }
    Array2D(const Array2D&amp; a)
        : zeilen(a.zeilen), spalten(a.spalten), ptr(new T[a.zeilen*a.spalten]) {
            const int ANZ = zeilen* spalten;
            for (size_t i=0; i&lt;ANZ; ++i) {
                ptr[i] = a.ptr[i];
            }
    }
    ~Array2D() { delete [ ] ptr; }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2405258</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405258</guid><dc:creator><![CDATA[MichelRT]]></dc:creator><pubDate>Mon, 23 Jun 2014 15:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 15:15:39 GMT]]></title><description><![CDATA[<p>Bei swap möchtest du doch die beiden Objekte vertauschen! Bei deiner Variante würdest du nur ptr vertauschen und die Spalten und Zeilen nur kopieren.</p>
<p>Kürzer (und damit besser lesbar) wäre also die Variante mittels std::swap (aus der Standard C++ Library):</p>
<pre><code class="language-cpp">void swap (Array2D&amp; a)
{
  std::swap(zeilen, a.zeilen);
  std::swap(spalten, a.spalten);
  std::swap(ptr, a.ptr);
}
</code></pre>
<p>Edit: Der Trick beim assign besteht darin, daß dort ein lokales Objekt 'a' (anstatt einer Referenz) benutzt wird, so daß nach dem swap-Aufruf dieses Objekt (in dem nun die Daten des ursprünglichen Objekts stehen) dann zerstört wird (d.h. der Destruktor aufgerufen wird).</p>
<p>PS. Dies nennt sich dann <a href="http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Copy-and-swap" rel="nofollow">Copy and swap idiom</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405259</guid><dc:creator><![CDATA[Th69]]></dc:creator><pubDate>Mon, 23 Jun 2014 15:15:39 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 15:31:53 GMT]]></title><description><![CDATA[<p>Danke erstmal für die Antworten!<br />
Ich möchte mich direkt auf ein Zitat lehnen, da ich meine Frage vermutlich undeutlich gestellt habe :</p>
<blockquote>
<p>Bei swap möchtest du doch die beiden Objekte vertauschen! Bei deiner Variante würdest du nur ptr vertauschen und die Spalten und Zeilen nur kopieren.</p>
</blockquote>
<p>Das Prinzip ist mir relativ klar, aber das <strong>Objekt &quot;a&quot;</strong> wird doch ohnehin nachdem &quot;assign&quot; ausgeführt wurde gelöscht. Von daher kann ich nachvollziehen, dass die Pointer vertauscht werden (alter Speicherplatz wird gelöscht ), aber wieso weise ich dem Objekt a noch die <strong>Zeilen und Spalten</strong> zu, wenn a ohnehin nach assign nicht mehr existiert? Zur Löschung benötige ich doch nur den Pointer (die alte &quot;Startadresse&quot; des Arrays&quot;), oder inwiefern vertue ich mich ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405268</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405268</guid><dc:creator><![CDATA[Cre]]></dc:creator><pubDate>Mon, 23 Jun 2014 15:31:53 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 15:37:29 GMT]]></title><description><![CDATA[<p>du verwechselst das schon wieder.</p>
<p>&quot;assign&quot; = Zuweisung. Du holst die Werte aus einem anderen Objekt. Das andere Objekt wird anschließend weggeworfen, da copy per value.</p>
<p>&quot;swap&quot; = tauschen. Du tauschst die Werte von zwei Objekten. Das andere Objekt wird daher per Referenz übergeben und existiert nach dem Aufruf weiter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405269</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 23 Jun 2014 15:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to Verständnisfrage on Mon, 23 Jun 2014 16:23:57 GMT]]></title><description><![CDATA[<p>Cre schrieb:</p>
<blockquote>
<p>Das Prinzip ist mir relativ klar, aber das <strong>Objekt &quot;a&quot;</strong> wird doch ohnehin nachdem &quot;assign&quot; ausgeführt wurde gelöscht. Von daher kann ich nachvollziehen, dass die Pointer vertauscht werden (alter Speicherplatz wird gelöscht ), aber wieso weise ich dem Objekt a noch die <strong>Zeilen und Spalten</strong> zu, wenn a ohnehin nach assign nicht mehr existiert? Zur Löschung benötige ich doch nur den Pointer (die alte &quot;Startadresse&quot; des Arrays&quot;), oder inwiefern vertue ich mich ?</p>
</blockquote>
<p>Dein Code, Deine Regeln.<br />
Aber selbst, wenn Du <code>swap()</code> nur in <code>assign()</code> aufrufst, finde ich die Benamsung irritierend - ein <code>swap()</code> , dass ein bisschen tauscht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Wenn Du Dein <code>assign()</code> mit swap() schreiben willst, dann mit <code>std::swap</code> nur auf den Speicher</p>
<pre><code class="language-cpp">Array2D&amp; assign(Array2D a)    
    {
        using std::swap;
        zeilen = a.zeilen;
        spalten = a.spalten;
        swap(ptr, a.ptr);
        return *this;
    }
</code></pre>
<p>o.ä.<br />
Finde ich persönlich auch nicht sofort ersichtlich, wie und warum da was passiert, aber immerhin.<br />
Dein <code>swap()</code> sollte aber wirklich komplett tauschen - so dass überall die Invariable &quot;ptr zeigt auf Speicher der Größe spalten*zeilen&quot; gilt. Alles andere wird Dir auf die Füße fallen.</p>
<p>MichelRT schrieb:</p>
<blockquote>
<pre><code>Array2D&amp; assign(Array2D a)     
    {
        zeilen = a.zeilen;
        spalten = a.spalten;
        ptr = a.ptr;
        return *this;
    }
</code></pre>
</blockquote>
<p>Da ist doch ein double delete vorprogrammiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2405274</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2405274</guid><dc:creator><![CDATA[Furble Wurble]]></dc:creator><pubDate>Mon, 23 Jun 2014 16:23:57 GMT</pubDate></item></channel></rss>