<?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[Referenzen und andere Fehlkonstruktionen]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachdem ich es endlich geschafft habe mich hier im Forum anzumelden - es sind erstaunlich viele Namen, die mir in den Sinn kamen bereits belegt - nun zu meiner Frage.</p>
<p>Ich belege zz. den Kurs &quot;Einführung in C++&quot; wo wir als Aufgabe bekommen haben eine Klasse &quot;MyString&quot; zu schreiben und diese mit einem gegebenen Testprogramm zu testen. An sich kein Problem, jedoch harkt es noch ein ein paar stellen, da C++ doch etwas anderes ist als Pascal, Java und C# (Die Programmiersprachen, in denen ich gewöhlich programmiere).</p>
<p>Unter anderem sollen wir einen Copy-Konstruktor implementieren:</p>
<pre><code class="language-cpp">MyString(MyString s);
</code></pre>
<p>Jedoch meckert so der gcc direkt und sagt, dass vermutlich eine Referenz, also:</p>
<pre><code class="language-cpp">MyString(MyString&amp; s);
</code></pre>
<p>gemeint ist. Soweit so gut, jedoch meckert der Compiler bei dieser Implementation im Testprogramm bei folgender Zeile (&quot;Keine passende Funktion für Aufruf MyString::MyString(MyString)&quot;):</p>
<pre><code class="language-cpp">MyString b = &quot;Blumentopferde&quot;;
</code></pre>
<p>Meine Implementation sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">MyString::MyString(MyString&amp; s) 
: m_length(s.length()), m_max_length(s.capacity()) {
	m_c_pointer = new char[s.capacity()];
	for (int len = 0; len &lt; s.length(); len++) {
		m_c_pointer[len] = s.m_c_pointer[len];
	}
}
</code></pre>
<p>--</p>
<p>Ein zweites Problem habe ich mit der Zeile</p>
<pre><code class="language-cpp">format(a.substring(iPos,iLae));

[...]

void format(MyString &amp;Ls) {
	cout &lt;&lt; &quot; (&quot; &lt;&lt; Ls.length()   &lt;&lt; &quot;|&quot; 
		     &lt;&lt; Ls.capacity() &lt;&lt; &quot;)  -  &quot;;
}
</code></pre>
<p>im Testprogramm.<br />
Meine Implementation von substring sieht dabei folgendermaßen aus:</p>
<pre><code class="language-cpp">MyString MyString::substring(int pos, int len) {
	if (pos &gt;= length()) {
		len = 0;
	} else if ((!len) || (pos + len &gt;= length())) {
		len = length() - pos;
	}
	MyString *subStr = new MyString(len);
	for (int i = 0; i &lt; len; i++) {
		subStr-&gt;m_c_pointer[i] = m_c_pointer[pos + i];
	}
	return *subStr;
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">a.substring(iPos,iLae).print();
</code></pre>
<p>funktioniert ohne Probleme.<br />
[edit]Die Fehlermeldung, die ich bekomme lautet übrigends: &quot;ungültige Initialisierung einer nicht-konstanten Referenz des Typs »MyString&amp;« von temporärem Wert des Typs »MyString«&quot;[/edit]</p>
<p>Um sich das ganze mal im Zusammenhang anschauen zu können habe ich das Projekt mal hochgeladen:<br />
<a href="http://uni.larskiesow.de/cpp/blatt07/mystring.zip" rel="nofollow">http://uni.larskiesow.de/cpp/blatt07/mystring.zip</a></p>
<p>Ich hoffe, dass ihr mir bei meinen beiden Problemen (möglichst mit Erklärung, warum es so ist) weiterhelfen könnt.</p>
<p>Gruß Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/229470/referenzen-und-andere-fehlkonstruktionen</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 00:33:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/229470.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Dec 2008 10:41:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 10:46:15 GMT]]></title><description><![CDATA[<p>Hallo zusammen,</p>
<p>nachdem ich es endlich geschafft habe mich hier im Forum anzumelden - es sind erstaunlich viele Namen, die mir in den Sinn kamen bereits belegt - nun zu meiner Frage.</p>
<p>Ich belege zz. den Kurs &quot;Einführung in C++&quot; wo wir als Aufgabe bekommen haben eine Klasse &quot;MyString&quot; zu schreiben und diese mit einem gegebenen Testprogramm zu testen. An sich kein Problem, jedoch harkt es noch ein ein paar stellen, da C++ doch etwas anderes ist als Pascal, Java und C# (Die Programmiersprachen, in denen ich gewöhlich programmiere).</p>
<p>Unter anderem sollen wir einen Copy-Konstruktor implementieren:</p>
<pre><code class="language-cpp">MyString(MyString s);
</code></pre>
<p>Jedoch meckert so der gcc direkt und sagt, dass vermutlich eine Referenz, also:</p>
<pre><code class="language-cpp">MyString(MyString&amp; s);
</code></pre>
<p>gemeint ist. Soweit so gut, jedoch meckert der Compiler bei dieser Implementation im Testprogramm bei folgender Zeile (&quot;Keine passende Funktion für Aufruf MyString::MyString(MyString)&quot;):</p>
<pre><code class="language-cpp">MyString b = &quot;Blumentopferde&quot;;
</code></pre>
<p>Meine Implementation sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">MyString::MyString(MyString&amp; s) 
: m_length(s.length()), m_max_length(s.capacity()) {
	m_c_pointer = new char[s.capacity()];
	for (int len = 0; len &lt; s.length(); len++) {
		m_c_pointer[len] = s.m_c_pointer[len];
	}
}
</code></pre>
<p>--</p>
<p>Ein zweites Problem habe ich mit der Zeile</p>
<pre><code class="language-cpp">format(a.substring(iPos,iLae));

[...]

void format(MyString &amp;Ls) {
	cout &lt;&lt; &quot; (&quot; &lt;&lt; Ls.length()   &lt;&lt; &quot;|&quot; 
		     &lt;&lt; Ls.capacity() &lt;&lt; &quot;)  -  &quot;;
}
</code></pre>
<p>im Testprogramm.<br />
Meine Implementation von substring sieht dabei folgendermaßen aus:</p>
<pre><code class="language-cpp">MyString MyString::substring(int pos, int len) {
	if (pos &gt;= length()) {
		len = 0;
	} else if ((!len) || (pos + len &gt;= length())) {
		len = length() - pos;
	}
	MyString *subStr = new MyString(len);
	for (int i = 0; i &lt; len; i++) {
		subStr-&gt;m_c_pointer[i] = m_c_pointer[pos + i];
	}
	return *subStr;
}
</code></pre>
<p>und</p>
<pre><code class="language-cpp">a.substring(iPos,iLae).print();
</code></pre>
<p>funktioniert ohne Probleme.<br />
[edit]Die Fehlermeldung, die ich bekomme lautet übrigends: &quot;ungültige Initialisierung einer nicht-konstanten Referenz des Typs »MyString&amp;« von temporärem Wert des Typs »MyString«&quot;[/edit]</p>
<p>Um sich das ganze mal im Zusammenhang anschauen zu können habe ich das Projekt mal hochgeladen:<br />
<a href="http://uni.larskiesow.de/cpp/blatt07/mystring.zip" rel="nofollow">http://uni.larskiesow.de/cpp/blatt07/mystring.zip</a></p>
<p>Ich hoffe, dass ihr mir bei meinen beiden Problemen (möglichst mit Erklärung, warum es so ist) weiterhelfen könnt.</p>
<p>Gruß Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629345</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629345</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Fri, 12 Dec 2008 10:46:15 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 10:48:30 GMT]]></title><description><![CDATA[<p>Hador_ schrieb:</p>
<blockquote>
<p>Unter anderem sollen wir einen Copy-Konstruktor implementieren:</p>
<pre><code class="language-cpp">MyString(MyString s);
</code></pre>
<p>Jedoch meckert so der gcc direkt und sagt, dass vermutlich eine Referenz, also:</p>
<pre><code class="language-cpp">MyString(MyString&amp; s);
</code></pre>
<p>gemeint ist.</p>
</blockquote>
<p>Genau. Mit Referenz, am besten auch const.</p>
<blockquote>
<p>Soweit so gut, jedoch meckert der Compiler bei dieser Implementation im Testprogramm bei folgender Zeile (&quot;Keine passende Funktion für Aufruf MyString::MyString(MyString)&quot;):</p>
<pre><code class="language-cpp">MyString b = &quot;Blumentopferde&quot;;
</code></pre>
</blockquote>
<p>Hierfür brauchst du auch noch einen Konstruktor der const char* als Parameter akzeptiert.</p>
<blockquote>
<p>Meine Implementation sieht folgendermaßen aus:</p>
<pre><code class="language-cpp">MyString::MyString(MyString&amp; s) 
: m_length(s.length()), m_max_length(s.capacity()) {
	m_c_pointer = new char[s.capacity()];
	for (int len = 0; len &lt; s.length(); len++) {
		m_c_pointer[len] = s.m_c_pointer[len];
	}
}
</code></pre>
</blockquote>
<p>Je nachdem wie length() definiert ist müsstest du hier auch noch die terminierende Null mitkopieren, oder?</p>
<blockquote>
<pre><code class="language-cpp">MyString MyString::substring(int pos, int len) {
	if (pos &gt;= length()) {
		len = 0;
	} else if ((!len) || (pos + len &gt;= length())) {
		len = length() - pos;
	}
	MyString *subStr = new MyString(len);
	for (int i = 0; i &lt; len; i++) {
		subStr-&gt;m_c_pointer[i] = m_c_pointer[pos + i];
	}
	return *subStr;
}
</code></pre>
</blockquote>
<p>Nicht new hier benutzt, sondern ein temporäres Objekt normal anlegen und zurückgeben. Sonst hast du ein Speicherleck.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629354</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629354</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Fri, 12 Dec 2008 10:48:30 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 10:56:14 GMT]]></title><description><![CDATA[<p>Der Compiler meckert zu recht beim Copy-Ctor. Der Grund ist recht einfach: wenn du einen String als Argument deklarierst und nicht eine Referenz auf einen String, dann legt der Compiler in der Funktion ein eigenes String-Objekt an. Um das zu machen kopiert er beim Funktionsaufruf das Objekt, das du als Parameter übergibst. Dieses kopieren geschieht aber mit dem copy-Ctor. Und jetzt überleg mal wie das wohl aussieht, wenn er beim Aufruf des Copy-Ctor erstmal das Argument per Copy-Ctor kopieren muss... <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>
<pre><code class="language-cpp">MyString b = &quot;Blumentopferde&quot;;
</code></pre>
<p>Hier verstecken sich zwei Konstruktoraufrufe (!):<br />
Wenn der Compiler sieht MyString b = &lt;irgendetwas&gt;, dann wandelt er erst das &lt;irgendetwas&gt; in ein temporäres MyString-Objekt um und ruft dann für die Konsturiktion von b den Copy-Ctor auf mit dem temporären Objekt als Argument. Soll heißen, die Initialisierung mit = ist immer eine Kopie, und wenn der Typ nicht stimmt wird er erst umgewandelt. Allerdings wird die Kopie meist wegoptimiert (sollte sie aber nur, wenn der Copy-Ctor keine Nebeneffekte hat)</p>
<p>Warum der Compiler jetzt meckert: der Copy-Ctor wird mit einem temporären Objekt aufgerufen. Da man die nicht noch großartig verändern kann, kann man allgemein temporäre objekte nur an Funktionen übergeben, die entweder eine Kopie anlegen (was beim copy-Ctor ja nicht geht) oder eine konstante Referenz als parameter haben. Bei deinem copy-Ctor ist die Referenz aber nicht konstant, deswegen findet der Compiler keine geeignete Funktion, der er das temporäre Objekt übergeben kann.</p>
<p>Lösung: Copy-Konstruktoren immer mit einer const Referenz als Signatur schreiben. So machts übrigens auch der Compiler, wenn er den Copy-Ctor für dich generiert:</p>
<pre><code class="language-cpp">class CopyMe
{
public:
  CopyMe(Copyme const&amp; other); //oder auch (const CopyMe&amp; other), ist beides das selbe.
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1629363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629363</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 12 Dec 2008 10:56:14 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 12:51:53 GMT]]></title><description><![CDATA[<p>Danke erst einmal für die schnellen Antworten.<br />
Den Konstruktor habe ich nun folgendermaßen umgesetzt:</p>
<pre><code class="language-cpp">MyString::MyString(const MyString&amp; s) 
: m_length(s.m_length), m_max_length(s.m_max_length) {
	m_c_pointer = new char[s.m_max_length];
	for (int len = 0; len &lt; s.m_length; len++) {
		m_c_pointer[len] = s.m_c_pointer[len];
	}
}
</code></pre>
<p>Und substring habe ich so verändert, dann die Objekte nun nicht mehr mit new erzeugt werden:</p>
<pre><code class="language-cpp">MyString MyString::substring(int pos, int len) {
	if (pos &gt;= length()) {
		len = 0;
	} else if ((!len) || (pos + len &gt;= length())) {
		len = length() - pos;
	}
	MyString subStr(len);
	for (int i = 0; i &lt; len; i++) {
		subStr.m_c_pointer[i] = m_c_pointer[pos + i];
	}
	return subStr;
}
</code></pre>
<p>Eine Frage noch dazu: Wird ein Objekt, wenn es mit className varName(arg) erzeugt wird immer automatisch freigegeben und muss niemals selbst zerstört werden?</p>
<p>--</p>
<p>Soweit, sogut, allerdings meckert er auch immer noch bei folgender Zeile:</p>
<pre><code class="language-cpp">format(a.substring(iPos,iLae));
</code></pre>
<p>An sich ist es ja das, was pumuckl eben bereits angesprochen hat: Durch a.substring(...) wird ein temporäres Objekt erzeugt und nun müsste der Parameter von format konstant sein, oder das ganz vorher in etwa so zwischengespeichert werden:</p>
<pre><code class="language-cpp">MyString xy = a.substring(iPos,iLae);
	format(xy);
</code></pre>
<p>Jedoch wären beides Änderungen im gegebenen Testprogramm und nicht im meiner Klasse. Dementsprechend sind diese Möglichkeiten an sich tabu.<br />
Daher die Frage: Gibt es für das Problem noch eine andere Möglichkeit? Oder ist einfach das Testprogramm &quot;falsch&quot;?</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/17700">@Fellhuhn</a>: Konstruktor habe ich und der String soll explizit ohne Endnull gespeichert werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629440</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629440</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Fri, 12 Dec 2008 12:51:53 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 13:00:31 GMT]]></title><description><![CDATA[<p>Du kannst format doch ändern. Nimm dort als Parameter eine konstante Referenz was du sowieso immer machen solltest wenn du am Parameter in der Funktion nichts ändern willst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629452</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629452</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Fri, 12 Dec 2008 13:00:31 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 13:06:21 GMT]]></title><description><![CDATA[<p>Braunstein schrieb:</p>
<blockquote>
<p>Du kannst format doch ändern. [...]</p>
</blockquote>
<p>Hador_ schrieb:</p>
<blockquote>
<p>[...] Jedoch wären beides Änderungen im gegebenen Testprogramm und nicht im meiner Klasse. Dementsprechend sind diese Möglichkeiten an sich tabu.<br />
Daher die Frage: Gibt es für das Problem noch eine andere Möglichkeit? Oder ist einfach das Testprogramm &quot;falsch&quot;?</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1629458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629458</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Fri, 12 Dec 2008 13:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 13:25:49 GMT]]></title><description><![CDATA[<p>Hador_ schrieb:</p>
<blockquote>
<p>...jedoch harkt es noch ein ein paar stellen, da C++ doch etwas anderes ist als Pascal, Java und C# (Die Programmiersprachen, in denen ich gewöhlich programmiere).</p>
</blockquote>
<p>Vielleicht solltest du erst einmal ein paar Grundlegende Unterschiede zwischen Java/C# und C++ genannt bekommen (Pascal liegt für mich zulange zurück), gerade zum Begriff Referenz. Den der Begriff Referenz und auch die Übergaben sind anders geregelt (Das ist ein Fallstrick in beide Richtungen).</p>
<p>C++ ist näher an den Grundlagen, und weniger abstrahiert wie Java/C#. Das heißt auch das man in C++ mehr angeben muss, und gleichzeitig mehr steuern kann.</p>
<p>C++ kennt drei wesentliche Arten der Parameterübergabe: Wert, Referenz, Zeiger (Kombiniert mit konstant/nicht konstant in verschiedenen Ausprägungen). In C#/Java wird vieles davon Typabhängig geregelt (Integrale Typen als Wert=Kopie, ansonsten als &quot;Referenz&quot; [Was in C++ aber dem Zeiger mit einer C++ Referenz-syntax entspricht]). Beides hat seine Vorteile (In C++ sieht man leichter um was es geht, in Java/C# ist wegen der geringeren Anzahl der Möglichkeit das Anwenden einfacher).</p>
<p>Hier mal eine Zusammenstellung aller mir auf anhieb einfallenden Parameterübergaben unter C++ in Kombination mit const (Achtung: Doppelzeiger etc. absichtlich außen vor gelassen, ebenso wie Referenzen auf Zeiger):</p>
<pre><code class="language-cpp">void foo(int a);
// 1. Übergabe einer int-Kopie
// Gearbeitet wird mit einer änderbaren Kopie

void foo(int &amp; a);
// 2. Übergabe einer int-Referenz
// Gearbeitet wird mit dem übergebenen Wert, unter anderen Namen. Eine
// Änderung, ändert den ursprungswert. Temporäre Übergaben sind unzulässig.
// Von der Syntax der Referenz in C#/Java ähnlich, aber null ist unzulässig,
// zudem kann eine Refenz nicht auf einen anderen Zeilwert verweisen.

void foo(int * a);
// 3. Übergabe eines Zeigers auf einen int-Wert
// Gearbeite wird mit einen Zeiger auf einen Wert, der Zeiger kann null
// annehmen. Das was du in C#/Java als Referenz kennst, entspricht in C++
// einem Zeiger, nur das der Zugriff eingeschränkter als unter C++ ist.
// In C++ ist sowohl der Wert als der Zeiger (Die Adresse in dem der Wert
// steht) beliebig änderbar

void foo(int const a);
// 4. Wie 1, nur die Kopie kann nicht geändert werden

void foo(int const &amp; a);
void foo(const int &amp; a); // Alternativschreibweise
// 5. Wie 2, nur die Referenz kann nicht geändert werden
// Zusätzlich darf man an eine konstanten Referenz auch temporäre Wärte binden!

void foo(int const * a);
void foo(const int * a); // Alternativschreibweise
// 6. Wie 3, wobei der Wert, auf den der Zeiger verweist konstant ist.
// Der Zeiger darf zwar auf eine andere Adresse &quot;umgebogen&quot; werden, der Wert ist
// über diesen Zeiger aber nicht Änderbar.

void foo(int * const a);
// 7. Wie 3, wobei der Zeiger konstant ist, nicht aber der Wert
// Der Zeiger (die Speicheradresse) ist konstant, der Wert ist aber änderbar.

void foo(int const * const a);
void foo(const int * const a); // Alternativschreibweise
// 8. Wie 3, Nur das Zeiger und Wert konstant sind
</code></pre>
<p>Wegen der Alternativschreibweise:<br />
Viele schreiben const vor den Wert, ich habe mir immer die erste Art angewöht, da man dann immer (auch bei Zeigern) direkt ablesen kann was konstant ist. Gelesen wird hier von links nach rechts:<br />
int const * = Int-Konstante Zeiger<br />
int * const = Int Zeiger-Konstante<br />
int const * cosnt = Int-Konstante Zeiger-Konstante</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629480</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629480</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Fri, 12 Dec 2008 13:25:49 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 16:00:42 GMT]]></title><description><![CDATA[<p>Danke, das ist doch mal eine schöne Übersicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Aber demnach hatte ich es ja schon richtig verstanden und man kommt um eine Änderung an der main-Methode nicht herum.</p>
<p>Lars</p>
<p>--</p>
<p>EDIT:<br />
Ich habe nun die Funktion format geändert, jedoch geht es so wie gedacht doch nicht:</p>
<pre><code class="language-cpp">[...]
  format(a.substring(iPos,iLae));
[...]

void format(MyString const &amp;Ls) {
	cout &lt;&lt; &quot; (&quot; &lt;&lt; Ls.length()   &lt;&lt; &quot;|&quot; 
		     &lt;&lt; Ls.capacity() &lt;&lt; &quot;)  -  &quot;;
}
</code></pre>
<p>Denn nun sagt mir der Compiler :&quot;Fehler: Die Übergabe von »const MyString« als »this«-Argument von »int MyString::length()« streicht Qualifizierer&quot; <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=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629494</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Fri, 12 Dec 2008 16:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 17:00:26 GMT]]></title><description><![CDATA[<p>Hador_ schrieb:</p>
<blockquote>
<p>...<br />
Denn nun sagt mir der Compiler :&quot;Fehler: Die Übergabe von »const MyString« als »this«-Argument von »int MyString::length()« streicht Qualifizierer&quot; <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=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Da stößt Du an const-Correctness (ebenfalls ein Konzept, das Java im Wesentlichen unbekannt ist <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="😉"
    /> ):<br />
- format() &quot;verspricht&quot;, das übergebene Objekt nicht zu ändern (const ... &amp;),<br />
- sie ruft aber length() auf, die dieses Versprechen NICHT macht.<br />
Lösung:<br />
MyString::length() &quot;const&quot; machen:</p>
<pre><code class="language-cpp">class MyString {
....
   size_t length() const;
</code></pre>
<p>Dasselbe natürlich auch mit capacity()...<br />
Falls das nicht geht, kommst Du nicht darum herum, format() ebenfalls zu &quot;ent-const-en&quot; (bitte hier nicht &quot;const_cast&quot; vorschlagen: Wenn die Klasse nicht in seinem Zugriff liegt, kann er auch nicht die const-Heit garantieren).</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629584</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 12 Dec 2008 17:00:26 GMT</pubDate></item><item><title><![CDATA[Reply to Referenzen und andere Fehlkonstruktionen on Fri, 12 Dec 2008 17:08:35 GMT]]></title><description><![CDATA[<p>Wieder was gelernt, danke!</p>
<p>Damit läuft nun alles. Jetzt muss ich nur noch dem Übungsleiter eine Mail schreiben und fragen, ob die Änderung der Main-Funktion so ok ist.</p>
<p>Gruß Lars</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1629590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1629590</guid><dc:creator><![CDATA[Hador_]]></dc:creator><pubDate>Fri, 12 Dec 2008 17:08:35 GMT</pubDate></item></channel></rss>