<?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 (Iterator als geschachtelte Klasse)]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgendes Programm:</p>
<pre><code class="language-cpp">//--------------main.cpp---------------------------
#include &lt;iostream.h&gt;
#include &quot;istack1.h&quot;

main()
{ Istack  s;           //Behaelter-Definition
  for (int j=0; j&lt;10; j++) s.push(j);
  Istack::iterator  i; //Iterator-Definition

  for (i=s.start( ); i!=s.ende( );  ++i) cout&lt;&lt;*i&lt;&lt;&quot; &quot;;

  getchar();
}
//-----------------------------------------Ergebnis
//  0 1 2 3 4                       -DS ist ein Feld
</code></pre>
<pre><code class="language-cpp">//----------------istack1.h-------------------------
typedef int T;
class Istack                               
{  T* erste;  int anz; int len;              
  public:                                     
   class iterator
   {  T* c;  //Zeiger auf aktuelles Element   
     public:                         
      iterator(T* cur=NULL):c(cur){}                                 
      bool operator!=(iterator i)const{return c!=i.c;}
      T&amp; operator*()const{return *c;}                
      iterator operator++(){ ++c; return *this;}      
   };

   Istack():anz(0),len(5){erste=new T[len];}
   iterator start(){ return erste;}       //&lt;---
   iterator ende(){ return erste+anz;}      
   void push(const T&amp; ee)
   { 
       if(len==anz) return;
       *(erste+anz)=ee;  anz++;
   } 
};
//--------------------------------------------------
</code></pre>
<p>Wenn ich folgendes...</p>
<pre><code class="language-cpp">iterator start(){ return erste;}
</code></pre>
<p>durch das...</p>
<pre><code class="language-cpp">iterator start(){return iterator(erste);}
</code></pre>
<p>ersetzte, ist das ja das gleiche, wie ich nach ausprobieren festgestellt habe.</p>
<p>Aber warum ist das eigentlich so?<br />
Ich würde nämlich sagen, dass ersteres...</p>
<pre><code class="language-cpp">iterator start(){ return erste;}
</code></pre>
<p>fogendes zurück gibt:</p>
<pre><code class="language-cpp">return iterator erste
</code></pre>
<p>Aber das würde den Konstruktor...</p>
<pre><code class="language-cpp">iterator(T* cur=NULL):c(cur){}
</code></pre>
<p>nicht aufrufen, weil das ja ohne Klammern ist und somit nicht der Form entsprechen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/267944/iterator-iterator-als-geschachtelte-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 02 Sep 2026 05:12:47 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/267944.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 01 Jun 2010 15:42:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 15:42:36 GMT]]></title><description><![CDATA[<p>Hallo,<br />
ich habe folgendes Programm:</p>
<pre><code class="language-cpp">//--------------main.cpp---------------------------
#include &lt;iostream.h&gt;
#include &quot;istack1.h&quot;

main()
{ Istack  s;           //Behaelter-Definition
  for (int j=0; j&lt;10; j++) s.push(j);
  Istack::iterator  i; //Iterator-Definition

  for (i=s.start( ); i!=s.ende( );  ++i) cout&lt;&lt;*i&lt;&lt;&quot; &quot;;

  getchar();
}
//-----------------------------------------Ergebnis
//  0 1 2 3 4                       -DS ist ein Feld
</code></pre>
<pre><code class="language-cpp">//----------------istack1.h-------------------------
typedef int T;
class Istack                               
{  T* erste;  int anz; int len;              
  public:                                     
   class iterator
   {  T* c;  //Zeiger auf aktuelles Element   
     public:                         
      iterator(T* cur=NULL):c(cur){}                                 
      bool operator!=(iterator i)const{return c!=i.c;}
      T&amp; operator*()const{return *c;}                
      iterator operator++(){ ++c; return *this;}      
   };

   Istack():anz(0),len(5){erste=new T[len];}
   iterator start(){ return erste;}       //&lt;---
   iterator ende(){ return erste+anz;}      
   void push(const T&amp; ee)
   { 
       if(len==anz) return;
       *(erste+anz)=ee;  anz++;
   } 
};
//--------------------------------------------------
</code></pre>
<p>Wenn ich folgendes...</p>
<pre><code class="language-cpp">iterator start(){ return erste;}
</code></pre>
<p>durch das...</p>
<pre><code class="language-cpp">iterator start(){return iterator(erste);}
</code></pre>
<p>ersetzte, ist das ja das gleiche, wie ich nach ausprobieren festgestellt habe.</p>
<p>Aber warum ist das eigentlich so?<br />
Ich würde nämlich sagen, dass ersteres...</p>
<pre><code class="language-cpp">iterator start(){ return erste;}
</code></pre>
<p>fogendes zurück gibt:</p>
<pre><code class="language-cpp">return iterator erste
</code></pre>
<p>Aber das würde den Konstruktor...</p>
<pre><code class="language-cpp">iterator(T* cur=NULL):c(cur){}
</code></pre>
<p>nicht aufrufen, weil das ja ohne Klammern ist und somit nicht der Form entsprechen würde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905565</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905565</guid><dc:creator><![CDATA[c++ user 0]]></dc:creator><pubDate>Tue, 01 Jun 2010 15:42:36 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 15:53:38 GMT]]></title><description><![CDATA[<p>Da findet eine sogenannte <em>implizite Konvertierung</em> statt. Wenn ein Objekt von einem bestimmten Typ erwartet wird, aber ein Objekt von einem anderen Typ gegeben wird UND ein passender Konstruktor vorhanden ist, dann wird dieser Konstruktor benutzt um ein passendes Objekt zu erzeugen.</p>
<p>Falls man dieses Verhalten nicht wünscht, muss man den entsprechenden Konstruktor explicit machen. Welche der beiden Verhaltensweisen sinnvoller ist, hängt vom jeweiligen Anwendungsfall ab.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905572</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905572</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 01 Jun 2010 15:53:38 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 16:02:25 GMT]]></title><description><![CDATA[<p>c++ user schrieb:</p>
<blockquote>
<p>Ich würde nämlich sagen, dass ersteres...</p>
<pre><code class="language-cpp">iterator start(){ return erste;}
</code></pre>
<p>fogendes zurück gibt:</p>
<pre><code class="language-cpp">return iterator erste
</code></pre>
</blockquote>
<p>Was würde denn dann zweiteres zurückgeben? <code>return iterator iterator(erste);</code> ?<br />
Tatsächlich passiert in etwa sowas:</p>
<pre><code class="language-cpp">// return erste --&gt;
iterator tmp(erste); // bzw: iterator tmp = erste
return tmp;

// return iterator(erste) --&gt;
iterator tmp(iterator(erste)); // bzw: iterator tmp = iterator(erste)
return tmp;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1905576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905576</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Tue, 01 Jun 2010 16:02:25 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 16:19:28 GMT]]></title><description><![CDATA[<p>was mir beim drübergucken aufgefallen ist:</p>
<pre><code class="language-cpp">iterator operator++(){ ++c; return *this;}
</code></pre>
<p>sicher, dass du das möchtest?<br />
es macht zwar in den meisten beispielen (auch in deinem) keinen unterschied, aber z.bsp.<br />
<code>++++iterator</code> verhält sich nicht so, wie du das erwartest.<br />
normalerweise gibt man beim prä-increment-operator eine referenz zurück:</p>
<pre><code class="language-cpp">iterator&amp; operator++(){ ++c; return *this;}
</code></pre>
<p>deine einrückung ist übrigens nicht all zu hübsch:</p>
<pre><code class="language-cpp">{  T* erste;  int anz; int len;
</code></pre>
<pre><code class="language-cpp">void push(const T&amp; ee)
   {
       if(len==anz) return;
       *(erste+anz)=ee;  anz++;
   }
</code></pre>
<p>hier passiert nicht nur etwas (aus anwendersicht) unerwartetes, sondern es ist noch dazu auch nicht wirklich leserlich:</p>
<pre><code class="language-cpp">void push(const T&amp; ee)
{
  if(len == anz)
    return; //immernoch doof

//  *(erste+anz) = ee;
  erste[anz] = ee; //übersichtlicher, meinst du nicht auch?
  anz++;
}
</code></pre>
<p>die unteren beiden zeilen könnte man auch noch zusammenfassen:<br />
<code>erste[anz++] = ee</code><br />
würde ich aber nicht machen, nur damit ich es auch mal geschrieben habe</p>
<p>zu deinem iterator-konstruktor:<br />
ich würde ihn zwar nicht explicit machen, aber eigentlich private und dafür die container-klasse als friend hinzufügen, sonst würde man so was hier machen dürfen:</p>
<pre><code class="language-cpp">int x;
Istack::iterator iter(&amp;x);
++iter;

std::cout &lt;&lt; *iter &lt;&lt; std::endl; //bumm!
</code></pre>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905584</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905584</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Tue, 01 Jun 2010 16:19:28 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 17:13:26 GMT]]></title><description><![CDATA[<p>Wow ihr seid ja schnell mit dem Antworten.<br />
Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905597</guid><dc:creator><![CDATA[c++ user 0]]></dc:creator><pubDate>Tue, 01 Jun 2010 17:13:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 17:15:16 GMT]]></title><description><![CDATA[<p>c++ user schrieb:</p>
<blockquote>
<p>Hallo,<br />
ich habe folgendes Programm:</p>
<pre><code class="language-cpp">//--------------main.cpp---------------------------
#include &lt;iostream.h&gt;
#include &quot;istack1.h&quot;

main()
//...
</code></pre>
</blockquote>
<p>Und auf 3 Zeilen gleich 2 dicke Fehler:<br />
&lt;iostream.h&gt; ist seit ca. 12 Jahren veraltet. Das ist im Bereich Computersprachen ungefähr so veraltet wie ne Dampfmaschine. Der Header heißt &lt;iostream&gt;. ohne .h am Ende.<br />
main() ist nichtmal veraltet, das war noch nie gültiges C++. main hat schon immer einen Rückgabetypen namens int. Das gabs mal in C - ist aber auch seit 1999 nicht mehr aktuell.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1905599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905599</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 01 Jun 2010 17:15:16 GMT</pubDate></item><item><title><![CDATA[Reply to Iterator (Iterator als geschachtelte Klasse) on Tue, 01 Jun 2010 17:34:38 GMT]]></title><description><![CDATA[<p>Noch ein heißer Tipp, da ich es erst jetzt sehe:</p>
<pre><code class="language-cpp">typedef int T;
</code></pre>
<p>Gehe ich Recht in der Annahme, dass du dies gemacht hat, um gegebenenfalls den Typ in deinem Stack einfach ändern zu können, ohne dabei überall im Code int durch den neuen Typ zu ersetzen?</p>
<p>Falls ja: C++ kennt da eine Technik die sogar noch besser funktioniert. Templates! Die sind genau dafür da.</p>
<p>Ich habe mal das gleiche Programm nochmal mit Templates geschrieben und auch einige der oben genannten Verbesserungen zugefügt (bis auf den privaten Konstruktor für den Iterator. Das fände ich unintuitiv.</p>
<pre><code class="language-cpp">#include &lt;cstddef&gt;  // Für Makro &quot;NULL&quot;

template &lt;typename T, int len=5&gt; class Istack                              
{ 
private:
  T* erste;
  int anz;

public:                                    
  class iterator
  {
  private:
    T* c;  
  public:                        
    iterator(T* cur=NULL):c(cur){}                                
    bool operator!=(iterator i)const{return c!=i.c;}
    T&amp; operator*()const{return *c;}                
    iterator&amp; operator++(){ ++c; return *this;}      
  };

  Istack():anz(0){erste=new T[len];}
  iterator start(){ return erste;}      
  iterator ende(){ return erste+anz;}      
  void push(const T&amp; ee)
  {
    if(len==anz) return;
    erste[anz] = ee;
    ++anz;
  }
};

// ...

#include &lt;iostream&gt;

using namespace std;

int main()
{ 
  Istack&lt;int&gt;  s;             // Hier sagen, welchen Typ und Länge man will. 5 ist Defaultlänge.
  for (int j=0; j&lt;10; j++) s.push(j);
  Istack&lt;int&gt;::iterator  i;   // Hier natürlich gleichen Typ und Länge wählen

  for (i=s.start( ); i!=s.ende( );  ++i) cout&lt;&lt;*i&lt;&lt;&quot; &quot;;

}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1905602</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1905602</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 01 Jun 2010 17:34:38 GMT</pubDate></item></channel></rss>