<?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[const Methode]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Beispiel:</p>
<pre><code class="language-cpp">class Foo {

public:
   Foo* getFoo() const {
      // Code...
      return this;
   }

};
</code></pre>
<p>getFoo() liefert einen Compilefehler, weil this ja vom Typ const Foo* const ist, aber ich Foo* zurückgebe.<br />
Aber so ganz verstehe ich das Problem nicht. Das const bei der Methode sagt doch nur, dass die Methode keine Member ändert. Und das mache ich ja nicht. Wieso geht das nicht?</p>
<p>Und wie kann ich das machen, dass die Methode const bleibt (weil sie ja keinen Foo Member ändert), aber dennoch ein Foo* returned (und NICHT const Foo*)?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/297404/const-methode</link><generator>RSS for Node</generator><lastBuildDate>Fri, 14 Aug 2026 11:40:57 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/297404.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 27 Dec 2011 15:07:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to const Methode on Tue, 27 Dec 2011 15:07:01 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>folgendes Beispiel:</p>
<pre><code class="language-cpp">class Foo {

public:
   Foo* getFoo() const {
      // Code...
      return this;
   }

};
</code></pre>
<p>getFoo() liefert einen Compilefehler, weil this ja vom Typ const Foo* const ist, aber ich Foo* zurückgebe.<br />
Aber so ganz verstehe ich das Problem nicht. Das const bei der Methode sagt doch nur, dass die Methode keine Member ändert. Und das mache ich ja nicht. Wieso geht das nicht?</p>
<p>Und wie kann ich das machen, dass die Methode const bleibt (weil sie ja keinen Foo Member ändert), aber dennoch ein Foo* returned (und NICHT const Foo*)?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161296</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161296</guid><dc:creator><![CDATA[Blockk_]]></dc:creator><pubDate>Tue, 27 Dec 2011 15:07:01 GMT</pubDate></item><item><title><![CDATA[Reply to const Methode on Tue, 27 Dec 2011 15:24:54 GMT]]></title><description><![CDATA[<p>gar nicht.</p>
<pre><code class="language-cpp">void bar(const foo&amp; me)
{
//const foo* const_me = me.get_foo();
  foo* non_const_me = me.get_foo();
//const_me-&gt;call_non_const_function(); //geht - natürlich - nicht
  non_const_me-&gt;call_non_const_function(); //geht auf einmal
}
</code></pre>
<p>wie willst du dem aufrufer das jetzt beibringen, dass er ein konstantes objekt übergibt, du es aber in der funktion trotzdem änderst?!</p>
<p>ansonsten _würde_ es über ein const_cast gehen; aber nur weil es geht, solltest du das noch lange nicht machen...<br />
wenn du durch das const nur sagen möchtest, dass du den pointer nicht umbiegst, ist das unnötig, weil du das mit dieser deklaration eh nicht könntest.</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2161303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161303</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 27 Dec 2011 15:24:54 GMT</pubDate></item><item><title><![CDATA[Reply to const Methode on Tue, 27 Dec 2011 15:31:49 GMT]]></title><description><![CDATA[<p>Blockk_ schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>folgendes Beispiel:</p>
<pre><code class="language-cpp">class Foo {
 
public:
   Foo* getFoo() const {
      // Code...
      return this;
   }

};
</code></pre>
<p>getFoo() liefert einen Compilefehler, weil this ja vom Typ const Foo* const ist, aber ich Foo* zurückgebe.<br />
Aber so ganz verstehe ich das Problem nicht. Das const bei der Methode sagt doch nur, dass die Methode keine Member ändert. Und das mache ich ja nicht. Wieso geht das nicht?<br />
Und wie kann ich das machen, dass die Methode const bleibt (weil sie ja keinen Foo Member ändert), aber dennoch ein Foo* returned (und NICHT const Foo*)?</p>
</blockquote>
<p>const bei einer Memberfunktion bedeutet zunächst einmal nur, dass der Objektparameter const-qualifiziert ist und this innerhalb der Funktion den Typ const Foo* hat. Die Unmöglichkeit, nichtstatische Member, die nicht mutable sind, über diesen Zeiger modifizieren zu können, ist Folge der const-Qualifikation, nicht umgekehrt.<br />
Die Rückgabe eines nicht-const-Zeigers aus this in einer const-Memberfunktion erfordert folglich einen cast - der in der Regel unsicher sein wird (weil die Funktion nicht sicherstellen kann, ob das jeweilige Objekt als solches modifizierbar ist).<br />
Falls du einen nicht-konstanten Zeiger nur in den Fällen benötigst, in denen das Ojekt sowieso modifizierbar ist, sollte die Funktion nicht konstant sein, oder es sollte eine entsprechend Überladung existieren.</p>
<pre><code class="language-cpp">class Foo {

public:
   const Foo* getFoo() const {
      // Code...
      return this;
   }
   Foo* getFoo() {
      return const_cast&lt;Foo*&gt;(const_cast&lt;const Foo*&gt;(this)-&gt;getFoo());
            // Das ist sicher, weil wir nur das const wegcasten, dass zuvor explizit hinzugefügt wurde und wir die Implementation von getFoo kennen
            // Die Tatsache, dass das eine über das andere implementiert wurde, ist folglich ein Implementationsartefakt und nicht selbst Teil des Interfaces
   }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2161306</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2161306</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 27 Dec 2011 15:31:49 GMT</pubDate></item></channel></rss>