<?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[Art des Iterators implementierungsspezifisch -&amp;gt; Was tun?]]></title><description><![CDATA[<p>Hallo zusammen. Ich habe folgende Problemstellung:</p>
<p>Für eine Klasse &quot;Graph&quot; macht es Sinn, einen Mechanismus anzubieten, um über alle Knoten oder alle Kanten des Graphen zu iterieren.</p>
<p>Andererseits soll meine Graph-Klasse eine allgemeine Schnittstelle sein. In was für einer Art Container die Knoten und Kanten vorliegen (vector, list, set, map...) ist also ein Implementierungsdetail und wird erst von Unterklassen näher spezifiziert.</p>
<p>Eine Methode wie getNodesBegin() fällt demnach flach, da sie ja als Typ den Iteratortyp haben müsste, also je nach Implementierung list::iterator, map::iterator oder so.</p>
<p>In Java gäbe es dazu die Oberklasse Iterator, so wie es ja die Oberklasse Collection gibt. Wie gehe ich soetwas nun in C++ an?</p>
<p>Kurz und bündig lautet mein Problem also: Gegeben eine Klasse, welche einen Container (noch) unbekannter Art kapselt. Finde einen Weg, dennoch allgemein über dessen Elemente zu iterieren...</p>
<p>Ich dachte zunächst an eine eigene Klasse &quot;NodesIterator&quot;, die entsprechend -&gt;, *, ++ und == überlädt, aber nur als abstrakte Methoden (also virtuell).</p>
<p>Eine Unterklasse von Graph, die dann Knoten in einem vector speichert, würde dann auch eine überladene Version von NodesIterator anbieten, welche eben den vector-iterator benutzt. Man hat sozusagen eine Wrapper-Klasse geschaffen.</p>
<p>Ist dies eine gute Lösung? Man hat ja dann recht viele virtuelle Funktionsaufrufe...</p>
<p>Gruß,<br />
Supertramp</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/180938/art-des-iterators-implementierungsspezifisch-gt-was-tun</link><generator>RSS for Node</generator><lastBuildDate>Tue, 22 Sep 2026 02:00:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/180938.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 08 May 2007 13:02:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 13:02:26 GMT]]></title><description><![CDATA[<p>Hallo zusammen. Ich habe folgende Problemstellung:</p>
<p>Für eine Klasse &quot;Graph&quot; macht es Sinn, einen Mechanismus anzubieten, um über alle Knoten oder alle Kanten des Graphen zu iterieren.</p>
<p>Andererseits soll meine Graph-Klasse eine allgemeine Schnittstelle sein. In was für einer Art Container die Knoten und Kanten vorliegen (vector, list, set, map...) ist also ein Implementierungsdetail und wird erst von Unterklassen näher spezifiziert.</p>
<p>Eine Methode wie getNodesBegin() fällt demnach flach, da sie ja als Typ den Iteratortyp haben müsste, also je nach Implementierung list::iterator, map::iterator oder so.</p>
<p>In Java gäbe es dazu die Oberklasse Iterator, so wie es ja die Oberklasse Collection gibt. Wie gehe ich soetwas nun in C++ an?</p>
<p>Kurz und bündig lautet mein Problem also: Gegeben eine Klasse, welche einen Container (noch) unbekannter Art kapselt. Finde einen Weg, dennoch allgemein über dessen Elemente zu iterieren...</p>
<p>Ich dachte zunächst an eine eigene Klasse &quot;NodesIterator&quot;, die entsprechend -&gt;, *, ++ und == überlädt, aber nur als abstrakte Methoden (also virtuell).</p>
<p>Eine Unterklasse von Graph, die dann Knoten in einem vector speichert, würde dann auch eine überladene Version von NodesIterator anbieten, welche eben den vector-iterator benutzt. Man hat sozusagen eine Wrapper-Klasse geschaffen.</p>
<p>Ist dies eine gute Lösung? Man hat ja dann recht viele virtuelle Funktionsaufrufe...</p>
<p>Gruß,<br />
Supertramp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280880</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280880</guid><dc:creator><![CDATA[Supertramp]]></dc:creator><pubDate>Tue, 08 May 2007 13:02:26 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 13:06:00 GMT]]></title><description><![CDATA[<p>Irgendwo gibst du auf jeden Fall den Container an (als Template-Parameter o.ä.) - und dann kannst du auch per 'typename CT::iterator' den dazu passenden Iteratortyp herausfinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280883</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280883</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 08 May 2007 13:06:00 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 13:24:52 GMT]]></title><description><![CDATA[<p>Wenn der Typ des Iterators noch unbekannt ist, und du trotzdem die Standard-Iteratoren bzw. deren Konzept beibehalten willst, solltest du in der getNodesBegin() einen Template-Typ zurück geben. Dann kann die ableitende Klasse den Typ per Template-Parameter selber setzen.</p>
<p>Wenn du keine Templates benutzen willst, solltest du einen Adapter-Iterator definieren, den die ableitenden Klassen implementieren müssen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280899</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280899</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 08 May 2007 13:24:52 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 13:59:09 GMT]]></title><description><![CDATA[<p>Supertramp schrieb:</p>
<blockquote>
<p>Andererseits soll meine Graph-Klasse eine allgemeine Schnittstelle sein. In was für einer Art Container die Knoten und Kanten vorliegen (vector, list, set, map...) ist also ein Implementierungsdetail und wird erst von Unterklassen näher spezifiziert.</p>
</blockquote>
<p>Soll/kann deine Graph-Klasse ein Template sein?</p>
<p>edit: oops, altes Tab <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280927</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280927</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 08 May 2007 13:59:09 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 14:19:34 GMT]]></title><description><![CDATA[<p>Danke für soviel konstruktive Beiträge.</p>
<p>Also, den Typ des Containers wollte ich eigentlich nicht als Template-Parameter angeben sondern von diversen Unterklassen spezifizieren lassen. Unter Umständen wird ja nicht mal ein echter Container benutzt und man muss sich für die Iteratorklasse ganz was neues einfallen lassen.</p>
<p>Mit dem Template-Typ, würde das so aussehen?</p>
<pre><code class="language-cpp">template&lt;class Iter&gt; Iter getNodesBegin();
</code></pre>
<p>Ich habe bisher fast nur Java gemacht, daher sind mir so subtile Sachen nicht ganz geläufig...</p>
<p>Die Adapter-Lösung, ist das nicht das, was ich eingangs beschrieben habe? Oder wieder ganz etwas anderes?</p>
<p>Schönen Gruß nochmal,<br />
Supertramp</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1280944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280944</guid><dc:creator><![CDATA[Supertramp]]></dc:creator><pubDate>Tue, 08 May 2007 14:19:34 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 14:59:13 GMT]]></title><description><![CDATA[<p>Das mit dem Template hast du schon richtig gemacht. Es hat halt den Vorteil, das letztendlich der Benutzer der Klasse selbst bestimmt, was er da einsetzt. D.h. der Benutzer bestimmt selbst, was er da für einen Typ einsetzt.</p>
<p>Bei einem Adapter oder Interface ist der Nachteil (sehe ich jedenfalls so), das du eine Iterator-Fähigkeit vorgeben mußt (z.b. nur in einzelnen Schritten nach vorne iterieren). Evtl. sind die Fähigkeiten so eingeschränkt, das du dann letztendlich wieder einen Container oder Iterator-Typ vorgeben kannst. Bei Templates ist das nicht so.</p>
<p>Naja, man kann halt nicht alles auf einmal haben, sonst würde es auch nur eine technische Lösung geben.</p>
<p>Es gibt noch folgendes: <a href="http://www.boost.org/libs/iterator/doc/index.html" rel="nofollow">http://www.boost.org/libs/iterator/doc/index.html</a><br />
Wird aber für einen C++-Umsteiger vielleicht dann auch zu viel des Guten sein. <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/1280972</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1280972</guid><dc:creator><![CDATA[Artchi]]></dc:creator><pubDate>Tue, 08 May 2007 14:59:13 GMT</pubDate></item><item><title><![CDATA[Reply to Art des Iterators implementierungsspezifisch -&amp;gt; Was tun? on Tue, 08 May 2007 15:52:58 GMT]]></title><description><![CDATA[<p>Ausgezeichnet <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>
<p>Danke nochmals für die hilfreichen Antworten.</p>
<p>Die Boost-Library führ ich mir dann bei Zeiten mal zu Gemüte, so dringend ist das ja nu nicht <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1281014</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1281014</guid><dc:creator><![CDATA[Supertramp]]></dc:creator><pubDate>Tue, 08 May 2007 15:52:58 GMT</pubDate></item></channel></rss>