<?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 == Code duplication?]]></title><description><![CDATA[<p>Gibts zu den 2 get eine alternative?</p>
<pre><code class="language-cpp">class Foo;

class Bla
{
public:
	Foo* get()
	{
		return f;
	}

	Foo const* get() const
	{
		return f;
	}

private:
	Foo* f;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/276269/const-code-duplication</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 10:56:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/276269.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 30 Oct 2010 03:53:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 03:53:06 GMT]]></title><description><![CDATA[<p>Gibts zu den 2 get eine alternative?</p>
<pre><code class="language-cpp">class Foo;

class Bla
{
public:
	Foo* get()
	{
		return f;
	}

	Foo const* get() const
	{
		return f;
	}

private:
	Foo* f;
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1972552</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972552</guid><dc:creator><![CDATA[((((((((())))))))))]]></dc:creator><pubDate>Sat, 30 Oct 2010 03:53:06 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 07:48:09 GMT]]></title><description><![CDATA[<p>Nein. In deinem Fall erst Recht nicht, weil du etwas erzwingst, das nicht einmal von const gefordert wurde.</p>
<p>//edit ich hole etwas weiter aus:</p>
<p>Das ist bereits perfekt const-correct:</p>
<pre><code class="language-cpp">class Bla
{
public:
    Foo* get()const
    {
        return f;
    }
private:
    Foo* f;
};
</code></pre>
<p>Warum? Du übergibst den Zeiger f als Kopie, damit ist f unveränderbar. const-correctness erstreckt sich aber nur über den Bereich eines Objektes - alles was hinter einem Zeiger liegt ist nach dieser Definition außerhalb. Deswegen wrde der Compiler bei so einer Deklaration nie meckern.</p>
<p>Anders sieht es hier aus</p>
<pre><code class="language-cpp">class Bla
{
public:
    Foo*&amp; get()
    {
        return f;
    }

    Foo*const&amp; get() const
    {
        return f;
    }

private:
    Foo* f;
};
</code></pre>
<p>Hier erlaubst du in der non-const Version, dass f selbst verändert wird. Das ist in der const-Version nach const-Definition nicht erlaubt, also brauchst du eine Zweite Methode. Das Objekt hinter dem Zeiger ist aber immer noch veränderbar.<br />
Man hätte sich natürlich überlegen können, ob man da einen Automatismus hätte einbauen können - haben die Leute vom Standard aber nicht gemacht.</p>
<p>Das was du machst ist also: &quot;f ist immer unveränderbar, aber wenn Bla const ist, ist auch *f unveränderlich&quot;. Und das es dafür einen sinnvollen Automatismus geben könnte ist auszuschließen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972568</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972568</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 30 Oct 2010 07:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 08:42:00 GMT]]></title><description><![CDATA[<p>otze schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class Bla
{
public:
    Foo* get()const
    {
        return f;
    }
private:
    Foo* f;
};
</code></pre>
<p>Das ist bereits perfekt const-correct:</p>
</blockquote>
<p>Das kommt darauf an wie man const correctness für sich definiert. Ich betrachte Konstanz als logische Konstanz, und wenn durch das Verändern der Foo Instanz bei f das Bla Objekt logisch verändert wird (was der Autor von Bla entscheiden muss) ist das Beispiel hier nicht korrekt. Das kann genauso auch andersherum gehen: Es werden Daten eines Objekts verändert, aber logisch ändert sich das Objekt nicht. Diese Daten kann man dann <code>mutable</code> deklarieren, so dass man sie in const Methoden verändern kann.</p>
<p>Das Beispiel des Threaderstellers kann also durchaus Sinn machen, wenn eine konstante Bla Referenz keinen nicht konstanten Zeiger auf die Foo Instanz rausrücken darf. Dass der Compiler da keine Problem mit hat, ist eine ganz andere Geschichte.</p>
<p>ps: Beim zweiten Lesen ist mir gar nicht mehr so klar, was jetzt Deine Aussage war.. naja ich poste trotzdem mal:-)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972580</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972580</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Sat, 30 Oct 2010 08:42:00 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 10:08:41 GMT]]></title><description><![CDATA[<p>Diese Code-Duplikation kann durchaus vorkommen. Aber das kannst du doch einfach umbiegen:</p>
<pre><code class="language-cpp">struct some_class {
   const int&amp; get_acess() const {
      log_access();
      // andere schöne Sachen
      return member_;
   }

   int&amp; get_element() {
      return const_cast&lt;int&amp;&gt;(static_cast&lt;const some_class*&gt;(this)-&gt;get_access());
   }
};
</code></pre>
<p>Macht aber nur Sinn, wenn in diesem getter viel passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972614</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972614</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sat, 30 Oct 2010 10:08:41 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 12:21:20 GMT]]></title><description><![CDATA[<p>Ad aCTa schrieb:</p>
<blockquote>
<p>Diese Code-Duplikation kann durchaus vorkommen. Aber das kannst du doch einfach umbiegen:</p>
<pre><code class="language-cpp">struct some_class {
   const int&amp; get_acess() const {
      log_access();
      // andere schöne Sachen
      return member_;
   }

   int&amp; get_element() {
      return const_cast&lt;int&amp;&gt;(static_cast&lt;const some_class*&gt;(this)-&gt;get_access());
   }
};
</code></pre>
<p>Macht aber nur Sinn, wenn in diesem getter viel passiert.</p>
</blockquote>
<p>Das ist so hässlich, dass es weh tut.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972666</guid><dc:creator><![CDATA[mmmmmmmm]]></dc:creator><pubDate>Sat, 30 Oct 2010 12:21:20 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 12:47:26 GMT]]></title><description><![CDATA[<p>mmmmmmmm schrieb:</p>
<blockquote>
<p>Das ist so hässlich, dass es weh tut.</p>
</blockquote>
<p>Weil man es normalerweise andersherum macht:</p>
<pre><code class="language-cpp">struct Test {
    int val;
    int&amp; get() {
        return val;
    }
    int const&amp; get() const {
        return const_cast&lt;Test*&gt;(this)-&gt;get();
    }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1972678</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972678</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 30 Oct 2010 12:47:26 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 14:12:47 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>mmmmmmmm schrieb:</p>
<blockquote>
<p>Das ist so hässlich, dass es weh tut.</p>
</blockquote>
<p>Weil man es normalerweise andersherum macht:</p>
<pre><code class="language-cpp">struct Test {
    int val;
    int&amp; get() {
        return val;
    }
    int const&amp; get() const {
        return const_cast&lt;Test*&gt;(this)-&gt;get();
    }
};
</code></pre>
</blockquote>
<p>Müsstest du das Ergebnis nicht noch nach const int&amp; casten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972711</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972711</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sat, 30 Oct 2010 14:12:47 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 16:09:15 GMT]]></title><description><![CDATA[<p>wxSkip schrieb:</p>
<blockquote>
<p>Müsstest du das Ergebnis nicht noch nach const int&amp; casten?</p>
</blockquote>
<p>Nein, warum? Geschieht doch schon implizit. Bei einem &quot;normalen&quot; getter castest du doch auch nicht noch explizit auf const ref. :p</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972754</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 30 Oct 2010 16:09:15 GMT</pubDate></item><item><title><![CDATA[Reply to Const == Code duplication? on Sat, 30 Oct 2010 16:15:41 GMT]]></title><description><![CDATA[<p>l'abra d'or schrieb:</p>
<blockquote>
<p>wxSkip schrieb:</p>
<blockquote>
<p>Müsstest du das Ergebnis nicht noch nach const int&amp; casten?</p>
</blockquote>
<p>Nein, warum? Geschieht doch schon implizit. Bei einem &quot;normalen&quot; getter castest du doch auch nicht noch explizit auf const ref. :p</p>
</blockquote>
<p>Ich benutze sowieso kein const <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="😉"
    /> (jedenfalls selten)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1972760</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1972760</guid><dc:creator><![CDATA[wxSkip]]></dc:creator><pubDate>Sat, 30 Oct 2010 16:15:41 GMT</pubDate></item></channel></rss>