<?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[Problem mit gesperrtem Kopierkonstruktor und anschließender Initialisierung]]></title><description><![CDATA[<p>Ich habe folgendes Testprogramm:</p>
<pre><code class="language-cpp">class Klasse
{
public:

	Klasse (int wert=0)
	{
	}

	void operator = (int wert)
	{
	}

private:

	Klasse (const Klasse &amp;objekt);
	void operator = (const Klasse &amp;objekt);
};

int main ()
{
	Klasse objekt1=5;
	Klasse objekt2 (5);
	Klasse objekt3;

	objekt3=5;
}
</code></pre>
<p>Wie man sehen kann, habe ich den Kopierkonstruktor und den =-Operator, die jeweils eine Referenz derselben Klasse übernehmen, gesperrt, denn es soll nicht möglich sein, die Objekte aufeinander zu kopieren. Allerdings habe ich einen Konstruktor und einen =-Operator, die jeweils eine Zahl entgegennehmen können. Was mich nun wundert: Sowohl in Zeile 21, als auch in Zeile 22 wird ja dieser (öffentliche, nicht gesperrte) Konstruktor aufgerufen. Und trotzdem gibt er mir für Zeile 21 den Fehler</p>
<blockquote>
<p>test.cpp:15: error: `Klasse::Klasse(const Klasse&amp;)' is private<br />
test.cpp:21: error: within this context</p>
</blockquote>
<p>während er für Zeile 22 keine Fehler anzeigt und auch alles fehlerfrei kompiliert, wenn ich Zeile 21 auskommentiere.</p>
<p>Ich würde nun gerne wissen, warum das so ist. Wenn ich den Kopierkonstruktor sperre und einen anderen Konstruktor erstelle, der einen Wert entgegennimmt, warum kann ich diesen per</p>
<pre><code class="language-cpp">Klasse objekt (wert);
</code></pre>
<p>aufrufen, aber nicht mit</p>
<pre><code class="language-cpp">Klasse objekt=wert;
</code></pre>
<p>Hätte ich den Kopierkonstruktor in Zeile 15 nicht gesperrt, sondern komplett rausgeschmissen, hätte auch alles funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/179633/problem-mit-gesperrtem-kopierkonstruktor-und-anschließender-initialisierung</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 07:27:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/179633.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 23 Apr 2007 23:34:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit gesperrtem Kopierkonstruktor und anschließender Initialisierung on Mon, 23 Apr 2007 23:34:55 GMT]]></title><description><![CDATA[<p>Ich habe folgendes Testprogramm:</p>
<pre><code class="language-cpp">class Klasse
{
public:

	Klasse (int wert=0)
	{
	}

	void operator = (int wert)
	{
	}

private:

	Klasse (const Klasse &amp;objekt);
	void operator = (const Klasse &amp;objekt);
};

int main ()
{
	Klasse objekt1=5;
	Klasse objekt2 (5);
	Klasse objekt3;

	objekt3=5;
}
</code></pre>
<p>Wie man sehen kann, habe ich den Kopierkonstruktor und den =-Operator, die jeweils eine Referenz derselben Klasse übernehmen, gesperrt, denn es soll nicht möglich sein, die Objekte aufeinander zu kopieren. Allerdings habe ich einen Konstruktor und einen =-Operator, die jeweils eine Zahl entgegennehmen können. Was mich nun wundert: Sowohl in Zeile 21, als auch in Zeile 22 wird ja dieser (öffentliche, nicht gesperrte) Konstruktor aufgerufen. Und trotzdem gibt er mir für Zeile 21 den Fehler</p>
<blockquote>
<p>test.cpp:15: error: `Klasse::Klasse(const Klasse&amp;)' is private<br />
test.cpp:21: error: within this context</p>
</blockquote>
<p>während er für Zeile 22 keine Fehler anzeigt und auch alles fehlerfrei kompiliert, wenn ich Zeile 21 auskommentiere.</p>
<p>Ich würde nun gerne wissen, warum das so ist. Wenn ich den Kopierkonstruktor sperre und einen anderen Konstruktor erstelle, der einen Wert entgegennimmt, warum kann ich diesen per</p>
<pre><code class="language-cpp">Klasse objekt (wert);
</code></pre>
<p>aufrufen, aber nicht mit</p>
<pre><code class="language-cpp">Klasse objekt=wert;
</code></pre>
<p>Hätte ich den Kopierkonstruktor in Zeile 15 nicht gesperrt, sondern komplett rausgeschmissen, hätte auch alles funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272091</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Mon, 23 Apr 2007 23:34:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit gesperrtem Kopierkonstruktor und anschließender Initialisierung on Tue, 24 Apr 2007 00:11:12 GMT]]></title><description><![CDATA[<p>Das Verhalten der Produktion</p>
<pre><code class="language-cpp">T x = y;
</code></pre>
<p>wird definiert als</p>
<pre><code class="language-cpp">T x = T( y );
</code></pre>
<p>Es wird also ein temporäres Objekt vom Typ T erstellt (unter Benutzung eines geeigneten Konstruktors) und dieses Objekt dann kopiert zur Erstellung von x. Es ist zulässig für den Compiler, die Erzeugung des temporären Objekts und die Kopie auszulassen und dafür x direkt zu konstruieren. Der Standard verlangt aber auch in diesem Falle, dass der Kopierkonstruktor zumindest aufrufbar <em>wäre</em>. Das ist nicht der Fall, also bricht der Compiler ab.</p>
<blockquote>
<p>Hätte ich den Kopierkonstruktor in Zeile 15 nicht gesperrt, sondern komplett rausgeschmissen, hätte auch alles funktioniert.</p>
</blockquote>
<p>Das liegt daran, dass dann der Compiler einen Kopierkonstruktor deklariert, der public ist. Als Grundsatz: jede Klasse hat einen Destruktor und (wenigstens) einen Kopierkonstruktor. Es ist schlicht unmöglich, eine Klasse zu definieren, auf die das nicht zutrifft. Im Einzelfall können dieser Konstruktor oder Destruktor nicht definiert werden - aber das ist eine andere Frage.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272094</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272094</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Apr 2007 00:11:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit gesperrtem Kopierkonstruktor und anschließender Initialisierung on Tue, 24 Apr 2007 10:18:09 GMT]]></title><description><![CDATA[<p>Aha. Es gibt also keine Möglichkeit, in meinem Falle = zu schreiben, richtig?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1272284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1272284</guid><dc:creator><![CDATA[NES-Spieler]]></dc:creator><pubDate>Tue, 24 Apr 2007 10:18:09 GMT</pubDate></item></channel></rss>