<?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[Iterator Klasse Postincrement]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab folgendes vor. Ich würde gerne das Iteratorenkonzept implementieren, also Inputiterator, Output,....</p>
<p>Nun habe ich abstrakte Klassen definiert, welche die notwendigen virtuellen Funktionsköpfe enthalten, und welche dann geerbt werden müssen von einem spezifischen Iterator.</p>
<p>Nun habe ich folgendes Problem. Den Preincrementoperator kann ich problemlos definieren.</p>
<pre><code class="language-cpp">virtual Iterator&amp; operator++() = 0;
</code></pre>
<p>Wie sieht es aber mit dem Postincrementoperator aus?</p>
<p>Dort müsste ich ja</p>
<pre><code class="language-cpp">virtual const Iterator operator++(int) = 0;
</code></pre>
<p>schreiben. Das geht aber nicht, da meine Klasse ja abstrakt ist, und ich deshalb eine Fehlermeldung bekomme, da ja keine Instanz gebildet werden kann.</p>
<p>Gibt es eine elegante Lösung, oder ist es nicht möglich? Gibt es eventuell ganz andere Konzepte, um das selbe zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307639/iterator-klasse-postincrement</link><generator>RSS for Node</generator><lastBuildDate>Thu, 06 Aug 2026 10:26:51 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307639.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 31 Aug 2012 18:49:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 18:49:06 GMT]]></title><description><![CDATA[<p>Hallo zusammen</p>
<p>Ich hab folgendes vor. Ich würde gerne das Iteratorenkonzept implementieren, also Inputiterator, Output,....</p>
<p>Nun habe ich abstrakte Klassen definiert, welche die notwendigen virtuellen Funktionsköpfe enthalten, und welche dann geerbt werden müssen von einem spezifischen Iterator.</p>
<p>Nun habe ich folgendes Problem. Den Preincrementoperator kann ich problemlos definieren.</p>
<pre><code class="language-cpp">virtual Iterator&amp; operator++() = 0;
</code></pre>
<p>Wie sieht es aber mit dem Postincrementoperator aus?</p>
<p>Dort müsste ich ja</p>
<pre><code class="language-cpp">virtual const Iterator operator++(int) = 0;
</code></pre>
<p>schreiben. Das geht aber nicht, da meine Klasse ja abstrakt ist, und ich deshalb eine Fehlermeldung bekomme, da ja keine Instanz gebildet werden kann.</p>
<p>Gibt es eine elegante Lösung, oder ist es nicht möglich? Gibt es eventuell ganz andere Konzepte, um das selbe zu implementieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247474</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247474</guid><dc:creator><![CDATA[uhsuhz]]></dc:creator><pubDate>Fri, 31 Aug 2012 18:49:06 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:14:44 GMT]]></title><description><![CDATA[<p>Einerseits würde ich mal Boost.Iterator angucken... ev. hast Du ja Boost zur Verfügung.</p>
<p>Konkret kann dein Problem so gelöst werden, dass Du beim Post Increment operator ein Zeiger zurückgibst, der auf eine auf dem Freestore erstellten Kopie des Iterators zeigt). Um alles noch ein weniger angenehmer zu machen, kanst Du das am besten mit Smart Pointer (std::unique_ptr&lt;..&gt;, std::shared_ptr&lt;..&gt;, falls die Klassen aus C++11 schon zur Verfügung stehen).</p>
<p>Die Kopie des Iterators kannst Du via Clone() Methode realisieren. Dazu verpasst Du dem Iterator Interface eine Clone() Methode, welche dann in der konkreten Iterator Klasse implementiert wird und eine Kopie (auf dem Freestore zurückgibt).</p>
<p><strong>Edit:</strong><br />
Ungefähre Idee im Code:</p>
<pre><code class="language-cpp">class Iterator
{
public:
  virtual std::unique_ptr&lt;Iterator&gt; clone() const = 0;

  virtual Iterator&amp; operator++() = 0;

  std::unique_ptr&lt;Iterator&gt; operator++(int)
  {
    auto temp = clone();
    ++(*this);
    retun temp;
  }

  // ..
};

class IteratorImpl
  : public Iterator
{
public:
  virtual std::unique_ptr&lt;Iterator&gt; clone() const
  {
    return std::unique_ptr&lt;Iterator&gt;(new IteratorImpl(*this));
  }

  virtual Iterator&amp; operator++()
  {
    // .. increment ..
    return *this;
  }
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2247478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247478</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:14:44 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:07:11 GMT]]></title><description><![CDATA[<p>Das ist so in C++ nicht ueblich. In C++ nimmt man Templates, die einem Flexibilitaet ohne zusaetzliche Kosten (virtuelle Funktionen, Heap-Allokation) erlauben.</p>
<p>C++ ist nicht Java.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247479</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247479</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:07:11 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:16:51 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Das ist so in C++ nicht ueblich. In C++ nimmt man Templates, die einem Flexibilitaet ohne zusaetzliche Kosten (virtuelle Funktionen, Heap-Allokation) erlauben.</p>
<p>C++ ist nicht Java.</p>
</blockquote>
<p>Und da sind sich natürlich alle Anwender von C++ einig... es gibt Gründe warum man das genau so machen möchte (Interface, virtuelle Funktionen, Freestore ist nur eine Folge davon).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247481</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:16:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:18:44 GMT]]></title><description><![CDATA[<p>Wenn dem so waere, hatte man es vermutlich schon desoefteren so gemacht. Natuerlich gibts Faelle, wo sowas vlt praktisch waere, aber ich glaube nicht, dass der TE schon in der Lage ist, zu entscheiden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247482</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:18:44 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:20:07 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Wenn dem so waere, hatte man es vermutlich schon desoefteren so gemacht. Natuerlich gibts Faelle, wo sowas vlt praktisch waere, aber ich glaube nicht, dass der TE schon in der Lage ist, zu entscheiden.</p>
</blockquote>
<p>Aber Du natürlich schon, besonders, da Du ja das Problem des TE so genau kennst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247484</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:20:07 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:22:03 GMT]]></title><description><![CDATA[<p>Ich lehne mich mal so weit aus dem Fenster, um zu sagen, dass die Standard-Methode mit grosser Wahrscheinlichkeit &quot;gut genug&quot; ist, ja. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247486</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:22:03 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:48:00 GMT]]></title><description><![CDATA[<p>Kellerautomat schrieb:</p>
<blockquote>
<p>Ich lehne mich mal so weit aus dem Fenster, um zu sagen, dass die Standard-Methode mit grosser Wahrscheinlichkeit &quot;gut genug&quot; ist, ja. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>Ja dann ist ja <s>gut</s> bestens.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247487</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:48:00 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:43:41 GMT]]></title><description><![CDATA[<p>Mal ein anderer Vorschlag: Wie wärs mit CRTP? <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>Dein Problem als solches ist schon die Idee. Da wirst du nicht weiter kommen. Das Problem ist mehr oder weniger, dass du eine Instanz einer abstrakten Klasse zurückgeben musst. Das geht aber nicht. Die kann nicht existieren. Also entweder Referenz/Zeiger (was du aus gutem Grund nicht willst), oder etwas anderes zurückgeben, was nicht abstrakt ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247491</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:43:41 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:50:15 GMT]]></title><description><![CDATA[<p>Ein Wunder, dass noch niemand geschrieben hat, der gezeigte Code sei kein C++. Ich bin zuversichtlich, dass das bald erwähnt wird...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247493</guid><dc:creator><![CDATA[theta]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:50:15 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:55:06 GMT]]></title><description><![CDATA[<p>Das Problem lässt sich auf folgende Klasse minimieren:</p>
<pre><code class="language-cpp">template&lt;typename der&gt;
struct A
{
        virtual der foo() = 0;
};
</code></pre>
<p>Mein Vorschlag:</p>
<pre><code class="language-cpp">template&lt;typename der&gt;
struct A
{
        virtual der foo() = 0;
};

struct B : public A&lt;B&gt;
{
        B foo() { return B(); } ///Wenn C++11-kompatibel, override dazu
};
</code></pre>
<p>Damit wäre das Konzept erhalten (oder?), und die Semantik korrekt.</p>
<p>theta schrieb:</p>
<blockquote>
<p>Ein Wunder, dass noch niemand geschrieben hat, der gezeigte Code sei kein C++. Ich bin zuversichtlich, dass das bald erwähnt wird...</p>
</blockquote>
<p>Na klar, wo ist denn der Konstruktor deklariert/definiert, der in Zeile 24 genutzt wird? <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/2247494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247494</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:55:06 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 19:57:13 GMT]]></title><description><![CDATA[<p>CRTP mit virtual. Ahja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247496</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247496</guid><dc:creator><![CDATA[Kellerautomat]]></dc:creator><pubDate>Fri, 31 Aug 2012 19:57:13 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Fri, 31 Aug 2012 20:37:37 GMT]]></title><description><![CDATA[<p>Edit: Näh, das ist Blödsinn.<br />
Schließlich wird eine dynamische Bindung damit unmöglich...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247500</guid><dc:creator><![CDATA[Sone]]></dc:creator><pubDate>Fri, 31 Aug 2012 20:37:37 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Sat, 01 Sep 2012 04:32:07 GMT]]></title><description><![CDATA[<p>Na theta haste zuviel Java programmiert in letzter Zeit? Deine Lösung ist absurd in C++.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247557</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247557</guid><dc:creator><![CDATA[beta]]></dc:creator><pubDate>Sat, 01 Sep 2012 04:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator Klasse Postincrement on Sat, 01 Sep 2012 05:54:28 GMT]]></title><description><![CDATA[<p>ich bin ja gespannt, wie Kellerautomat seine templatisierten Iteratoren verwendet, wenn er late binding braucht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    />.</p>
<p>Die Lösung ist, wie bereits angesprochen, ein Proxy-Objekt das von Iterator abgeleitet ist und eine temporäre Kopie des Iterators enthält, die zum Schluss zerstört wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2247560</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2247560</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sat, 01 Sep 2012 05:54:28 GMT</pubDate></item></channel></rss>