<?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[Member setzen mit call-by-reference]]></title><description><![CDATA[<p>Hallo,</p>
<p>in einem Projekt, das nicht von mir stammt habe ich folgende getter/setter Methoden gefunden:</p>
<pre><code class="language-cpp">class SomeClass {
private:
	MemberType member;
public:
	void setMember(const MemberType&amp; m) {
		this-&gt;member = m;
	}
	const MemberType&amp; getMember() {
		return this-&gt;member;
	}
};
</code></pre>
<p>wobei <code>MemberType</code> halt ne relativ große Klasse ist:</p>
<pre><code class="language-cpp">class MemberType {
private:
	// ... viele member Variablen
public:
	// ... getter/setter
	// ... anderes Zeug
};
</code></pre>
<p>Die Art und Weise, wie die Getter/Setter in <code>SomeClass</code> arbeiten wundert mich. Warum funktioniert diese Call-By-Reference Methode? Angenommen ich habe eine weitere Klasse <code>AnotherClass</code> , die selbst eine Membervariable vom Typ <code>SomeClass</code> besitzt und eine Methode, die deren member setzt:</p>
<pre><code class="language-cpp">class AnotherClass {
private:
	SomeClass c;
public:
	void doSomething() {
		MemberType m;
		// ... setze Felder von m
		c.setMember(m);
	}
};
</code></pre>
<p>Nach meiner Vorstellung wird <code>m</code> doch bei Verlassen von <code>doSomething()</code> zerstört? Wie kann also die SomeClass::member einen gültigen Wert enthalten? Wird an irgendeiner Stelle doch eine Kopie vom ursprünglichen Objekt erstellt?</p>
<p>Grüße,<br />
Björn</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/257081/member-setzen-mit-call-by-reference</link><generator>RSS for Node</generator><lastBuildDate>Thu, 10 Sep 2026 15:54:37 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/257081.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 22 Dec 2009 13:47:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Member setzen mit call-by-reference on Tue, 22 Dec 2009 13:47:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>in einem Projekt, das nicht von mir stammt habe ich folgende getter/setter Methoden gefunden:</p>
<pre><code class="language-cpp">class SomeClass {
private:
	MemberType member;
public:
	void setMember(const MemberType&amp; m) {
		this-&gt;member = m;
	}
	const MemberType&amp; getMember() {
		return this-&gt;member;
	}
};
</code></pre>
<p>wobei <code>MemberType</code> halt ne relativ große Klasse ist:</p>
<pre><code class="language-cpp">class MemberType {
private:
	// ... viele member Variablen
public:
	// ... getter/setter
	// ... anderes Zeug
};
</code></pre>
<p>Die Art und Weise, wie die Getter/Setter in <code>SomeClass</code> arbeiten wundert mich. Warum funktioniert diese Call-By-Reference Methode? Angenommen ich habe eine weitere Klasse <code>AnotherClass</code> , die selbst eine Membervariable vom Typ <code>SomeClass</code> besitzt und eine Methode, die deren member setzt:</p>
<pre><code class="language-cpp">class AnotherClass {
private:
	SomeClass c;
public:
	void doSomething() {
		MemberType m;
		// ... setze Felder von m
		c.setMember(m);
	}
};
</code></pre>
<p>Nach meiner Vorstellung wird <code>m</code> doch bei Verlassen von <code>doSomething()</code> zerstört? Wie kann also die SomeClass::member einen gültigen Wert enthalten? Wird an irgendeiner Stelle doch eine Kopie vom ursprünglichen Objekt erstellt?</p>
<p>Grüße,<br />
Björn</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826385</guid><dc:creator><![CDATA[bhurling]]></dc:creator><pubDate>Tue, 22 Dec 2009 13:47:12 GMT</pubDate></item><item><title><![CDATA[Reply to Member setzen mit call-by-reference on Tue, 22 Dec 2009 14:00:50 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">void setMember(const MemberType&amp; m) {
        this-&gt;member = m; //da wird kopiert
    }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1826395</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826395</guid><dc:creator><![CDATA[TyRoXx]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:00:50 GMT</pubDate></item><item><title><![CDATA[Reply to Member setzen mit call-by-reference on Tue, 22 Dec 2009 14:10:30 GMT]]></title><description><![CDATA[<p>Ich verstehe nicht, wo das Problem sein soll. Kannst Du es detaillierter beschreiben, was Du glaubst, das hier passiert / eventuell schief geht?</p>
<p>bhurling schrieb:</p>
<blockquote>
<p>Nach meiner Vorstellung wird <code>m</code> doch bei Verlassen von <code>doSomething()</code> zerstört? Wie kann also die SomeClass::member einen gültigen Wert enthalten?</p>
</blockquote>
<p>1. Ja<br />
2. Durch den Aufruf von setMember, nicht?</p>
<p>bhurling schrieb:</p>
<blockquote>
<p>Wird an irgendeiner Stelle doch eine Kopie vom ursprünglichen Objekt erstellt?</p>
</blockquote>
<p>So in etwa. Was glaubst Du, was die Zuweisung in setMember macht?</p>
<p>Ich habe den Eindruck, dass Du aus der Java-Welt kommst und Dich nur schwer daran gewöhnen kannst, dass Variablen von Klassentypen in C++ keine &quot;Java-Referenzen&quot; sondern die Objekte selbst sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826403</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826403</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:10:30 GMT</pubDate></item><item><title><![CDATA[Reply to Member setzen mit call-by-reference on Tue, 22 Dec 2009 14:50:24 GMT]]></title><description><![CDATA[<p>Danke TyRoXx. Ich wollte nur verstehen, weshalb der Autor diese Art von Funktionsaufruf gewählt hat. Welchen Vorteil hat in diesem Fall call-by-reference, wenn innerhalb der Methode eben doch eine Kopie erzeugt wird?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1826421</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826421</guid><dc:creator><![CDATA[bhurling]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Member setzen mit call-by-reference on Tue, 22 Dec 2009 14:59:29 GMT]]></title><description><![CDATA[<p>bhurling schrieb:</p>
<blockquote>
<p>Danke TyRoXx. Ich wollte nur verstehen, weshalb der Autor diese Art von Funktionsaufruf gewählt hat. Welchen Vorteil hat in diesem Fall call-by-reference, wenn innerhalb der Methode eben doch eine Kopie erzeugt wird?</p>
</blockquote>
<p>Du musst nicht zwei Mal kopieren.</p>
<pre><code class="language-cpp">void SomeClass::setMember(MemberType m) // &lt;-- erste Kopie
{
    member = m; // &lt;-- zweite Kopie
}
</code></pre>
<p>Hier wird einer Membervariable ein Wert zugewiesen, diese Kopie ist also unvermeidlich. Allerdings hast du Recht, wenn es sich um lokale Kopien handelt, da kann man die Kopie auch in der Parameterliste durchführen (ist ggf. sogar von Vorteil bezüglich Optimierungen).</p>
<pre><code class="language-cpp">void DoSomething(const AnyType&amp; x)
{
    AnyType copy = x;
    // arbeite mit copy
}

void DoSomething(AnyType x)
{
    // arbeite mit x
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1826431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1826431</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 22 Dec 2009 14:59:29 GMT</pubDate></item></channel></rss>