<?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[Auswahl const-Funktion vs. Non-const-Funktion]]></title><description><![CDATA[<p>Hallo, gut im neuen Jahr gestartet? <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>
<p>Ich hätte gleich wieder eine Frage. Momentan arbeite ich mich ein wenig tiefer in Iteratoren ein, dabei habe ich einen kleinen Container geschrieben. <code>const_iterator</code> ist dabei eine Klasse, die Iteratorfunktionalität bereitstellt, und bei der die Dereferenzierung Const-Zeiger/-Referenzen zurückgibt. Die Klasse <code>iterator</code> ist davon abgeleitet und überschreibt die Dereferenzierungsoperatoren, sodass die referenzierte Objekte veränderbar sind.</p>
<p>Nun habe ich für den Container diverse Methoden bereitgestellt, einige davon in einer <code>const</code> - und einer normalen Version. Als Beispiel:</p>
<pre><code class="language-cpp">iterator              end();
const_iterator        end() const;
</code></pre>
<p>Da ich nun die Vererbungshierarchie habe, wird die eine Funktion gar nie aufgerufen - <code>iterator</code> ist implizit in <code>const_iterator</code> konvertierbar.</p>
<p>Dasselbe passiert auch beim Indexoperator, allerdings hier aus einem anderen Grund. Ich habe wieder zwei Deklarationen:</p>
<pre><code class="language-cpp">reference             operator[] (size_type index);
const_reference       operator[] (size_type index) const;
</code></pre>
<p>Selbst wenn ich das Objekt nicht verändere, also beispielsweise einen der folgenden Aufrufe habe, wird die nicht-konstante Version aufgerufen.</p>
<pre><code class="language-cpp">int a = container[3];
const int&amp; b = container[3];
</code></pre>
<p>Woran liegt das? Ich dachte, es werde automatisch die Version gesucht, bei der möglichst viele Qualifizierer vorhanden sind. Oder wie macht man das richtig?</p>
<p><em><strong>Edit:</strong></em> Ich hab mir dazu gerade noch was überlegt. Könnte es sein, dass man die beiden Versionen der Memberfunktionen nur schreibt, um auch bei konstanten Containern gewisse Operationen zu erlauben?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/230767/auswahl-const-funktion-vs-non-const-funktion</link><generator>RSS for Node</generator><lastBuildDate>Fri, 25 Sep 2026 16:47:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/230767.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 01 Jan 2009 18:53:05 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Thu, 01 Jan 2009 19:03:05 GMT]]></title><description><![CDATA[<p>Hallo, gut im neuen Jahr gestartet? <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>
<p>Ich hätte gleich wieder eine Frage. Momentan arbeite ich mich ein wenig tiefer in Iteratoren ein, dabei habe ich einen kleinen Container geschrieben. <code>const_iterator</code> ist dabei eine Klasse, die Iteratorfunktionalität bereitstellt, und bei der die Dereferenzierung Const-Zeiger/-Referenzen zurückgibt. Die Klasse <code>iterator</code> ist davon abgeleitet und überschreibt die Dereferenzierungsoperatoren, sodass die referenzierte Objekte veränderbar sind.</p>
<p>Nun habe ich für den Container diverse Methoden bereitgestellt, einige davon in einer <code>const</code> - und einer normalen Version. Als Beispiel:</p>
<pre><code class="language-cpp">iterator              end();
const_iterator        end() const;
</code></pre>
<p>Da ich nun die Vererbungshierarchie habe, wird die eine Funktion gar nie aufgerufen - <code>iterator</code> ist implizit in <code>const_iterator</code> konvertierbar.</p>
<p>Dasselbe passiert auch beim Indexoperator, allerdings hier aus einem anderen Grund. Ich habe wieder zwei Deklarationen:</p>
<pre><code class="language-cpp">reference             operator[] (size_type index);
const_reference       operator[] (size_type index) const;
</code></pre>
<p>Selbst wenn ich das Objekt nicht verändere, also beispielsweise einen der folgenden Aufrufe habe, wird die nicht-konstante Version aufgerufen.</p>
<pre><code class="language-cpp">int a = container[3];
const int&amp; b = container[3];
</code></pre>
<p>Woran liegt das? Ich dachte, es werde automatisch die Version gesucht, bei der möglichst viele Qualifizierer vorhanden sind. Oder wie macht man das richtig?</p>
<p><em><strong>Edit:</strong></em> Ich hab mir dazu gerade noch was überlegt. Könnte es sein, dass man die beiden Versionen der Memberfunktionen nur schreibt, um auch bei konstanten Containern gewisse Operationen zu erlauben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638057</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638057</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 01 Jan 2009 19:03:05 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Thu, 01 Jan 2009 20:02:01 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p><em><strong>Edit:</strong></em> Ich hab mir dazu gerade noch was überlegt. Könnte es sein, dass man die beiden Versionen der Memberfunktionen nur schreibt, um auch bei konstanten Containern gewisse Operationen zu erlauben?</p>
</blockquote>
<p>Genau. Wenn es die const-Varianten der Memberfunktionen nicht gäbe, dann wären konstante Container ja praktisch wertlos, da es nichts gäbe, was man damit noch machen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638080</guid><dc:creator><![CDATA[dooooomi]]></dc:creator><pubDate>Thu, 01 Jan 2009 20:02:01 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Thu, 01 Jan 2009 20:20:05 GMT]]></title><description><![CDATA[<p>Okay, danke für die Bestätigung. Ich hatte drum noch im Hinterkopf, dass die <code>const</code> -Varianten hier noch einen anderen Zweck hätten... Aber scheinbar nicht. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1638087</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638087</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 01 Jan 2009 20:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Fri, 02 Jan 2009 12:24:21 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>[...] habe ich einen kleinen Container geschrieben. <code>const_iterator</code> ist dabei eine Klasse, die Iteratorfunktionalität bereitstellt, und bei der die Dereferenzierung Const-Zeiger/-Referenzen zurückgibt. <strong>Die Klasse <code>iterator</code> ist davon abgeleitet und überschreibt die Dereferenzierungsoperatoren, sodass die referenzierte Objekte veränderbar sind.</strong></p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /> Ein <code>iterator</code> <strong>ist also ein</strong> <code>const_iterator</code> ? (Oder verwendest du keine public-Vererbung?)</p>
<p>Felix</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638311</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638311</guid><dc:creator><![CDATA[Phoemuex]]></dc:creator><pubDate>Fri, 02 Jan 2009 12:24:21 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Fri, 02 Jan 2009 13:40:06 GMT]]></title><description><![CDATA[<p>iterator und const_iterator sind nicht verwandt. das bedeutet dass man hier doppelten Code schreiben muss, oder aber boost verwenden: <a href="http://www.boost.org/doc/libs/1_37_0/libs/iterator/doc/index.html#iterator-facade-and-adaptor" rel="nofollow">http://www.boost.org/doc/libs/1_37_0/libs/iterator/doc/index.html#iterator-facade-and-adaptor</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638342</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Fri, 02 Jan 2009 13:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Sat, 03 Jan 2009 14:00:22 GMT]]></title><description><![CDATA[<p>Ich habe auch schon gehört, dass man das besser nicht tun soll. Aber die Standardbibliothek macht es ja auch so, zumindest in meiner Implementierung (MSVC++ 2008 Express):</p>
<pre><code class="language-cpp">template&lt;class _Ty,
	class _Alloc&gt;
	class _Vector_iterator
		: public _Vector_const_iterator&lt;_Ty, _Alloc&gt;
	{	
		// ...
	}
</code></pre>
<p>Was ist denn daran so schlecht?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1638810</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1638810</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 03 Jan 2009 14:00:22 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 14:38:12 GMT]]></title><description><![CDATA[<p>Würde mich jetzt schon noch interessieren, was gegen die Vererbung spräche, zumal der Standard es bei mir auch so macht. Klar, von der Logik her ist es nicht sehr intuitiv ( <code>iterator</code> ist ein <code>const_iterator</code> ), aber andererseits besitzt ein <code>iterator</code> die gesamte Funktionalität eines <code>const_iterator</code> s und noch darüber hinaus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1639864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1639864</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 05 Jan 2009 14:38:12 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 20:38:33 GMT]]></title><description><![CDATA[<p>Du kannst die iteratoren ploetzlich polymorph verwenden.</p>
<p>Die wirkliche Frage sollte eher sein:<br />
warum will ich hier Vererbung haben?</p>
<p>Die Antwort ist: weil es mir schreibarbeit erspart.</p>
<p>Und damit sollte das Thema erledigt sein. Denn &quot;weil es mir schreibarbeit erspart&quot; ist meistens ein guter Hinweis auf einen Designfehler.</p>
<p>Vererbung ist eine enorm starke Bindung die ich nur eingehen will, wenn es mir einen wirklichen Vorteil bringt. Aber die Boost Iterator Facade/Adapter Sachen ersparen mir Kopplung und Schreibarbeit im Vergleich zu der Vererbungsvariante.</p>
<p>Der wirkliche Grund warum viele Standard Libraries iteratoren so implementieren ist weil es einfach und standard konform ist. Aber ist es deshalb gut?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640100</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640100</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:38:33 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 20:52:58 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Der wirkliche Grund warum viele Standard Libraries iteratoren so implementieren ist weil es einfach und standard konform ist. Aber ist es deshalb gut?</p>
</blockquote>
<p>Ja, weil es unnötige Codeduplizierung vermeidet, und damit entsprechende Copy and Paste Fehler minimiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640108</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:52:58 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 20:57:37 GMT]]></title><description><![CDATA[<p>und ich dachte immer, öffnetliche erblichkeit würde IST EIN bedeuten.<br />
da fällt mir nur <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html</a> zu ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640110</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640110</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 05 Jan 2009 20:57:37 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 21:00:38 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>und ich dachte immer, öffnetliche erblichkeit würde IST EIN bedeuten.<br />
da fällt mir nur <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html</a> zu ein.</p>
</blockquote>
<p>Private Vererbung wäre vielleicht angebrachter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640112</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Mon, 05 Jan 2009 21:00:38 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Mon, 05 Jan 2009 21:13:42 GMT]]></title><description><![CDATA[<p>Tachyon schrieb:</p>
<blockquote>
<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>Der wirkliche Grund warum viele Standard Libraries iteratoren so implementieren ist weil es einfach und standard konform ist. Aber ist es deshalb gut?</p>
</blockquote>
<p>Ja, weil es unnötige Codeduplizierung vermeidet, und damit entsprechende Copy and Paste Fehler minimiert.</p>
</blockquote>
<p>Und die Nachteile ignorieren wir einfach?</p>
<p>natuerlich ist es bequem. aber bequem ist meistens falsch.</p>
<p>schau dir bitte boost iterator facade/adapter an. du schreibst einen bruchteil von code den du mit der vererbungsvariante brauchst und bist deutlich fehlerfreier.</p>
<p>wenn du privat vererbst umgehst du zwar die probleme hast aber wieder viel schreibarbeit. und dann wuerde ich sowieso zu layering raten, du hast ein iterator objekt dass alle operationen anbietet und jeweils eine facade fuer iterator und const_iterator drueber...</p>
<p>aber die richtige wahl ist dennoch boost...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640120</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640120</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Mon, 05 Jan 2009 21:13:42 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Tue, 06 Jan 2009 18:11:56 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>da fällt mir nur <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html" rel="nofollow">http://www.c-plusplus.net/forum/viewtopic-var-t-is-75672-and-highlight-is-bebel.html</a> zu ein.</p>
</blockquote>
<p>Nettes Geschichtlein. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Ich werde mir wahrscheinlich mal Boost.Iterator anschauen. Danke für die Antworten! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1640576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1640576</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 06 Jan 2009 18:11:56 GMT</pubDate></item><item><title><![CDATA[Reply to Auswahl const-Funktion vs. Non-const-Funktion on Thu, 15 Jan 2009 19:10:47 GMT]]></title><description><![CDATA[<p>mammamia;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1646508</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1646508</guid><dc:creator><![CDATA[jtsfds133]]></dc:creator><pubDate>Thu, 15 Jan 2009 19:10:47 GMT</pubDate></item></channel></rss>