<?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[Unerklärliches Problem beim Iterieren über std::list]]></title><description><![CDATA[<p>Hi,<br />
Ich habe folgenden Code [Auschnitt]</p>
<pre><code class="language-cpp">namespace Util
  {
    template &lt;typename string_type&gt; class Log
    {
      public:
        typedef Logger&lt;string_type&gt; logger_type; 
        typedef std::list&lt;logger_type*&gt; logger_list_type;

      private:
        Log()
        {
          this-&gt;loggers = new std::list&lt;logger_type*&gt;();
        }

        logger_list_type* loggers;

      public:
        void operator()(const string_type &amp; message) const
        {
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) {
            iter-&gt;logMessage(message);
          }
        }
    };

    template &lt;typename string_type&gt; class Logger
    {
      public: 
        virtual void logMessage(string_type &amp; message)
        {
        }
    };
  }
</code></pre>
<p>Wenn ich diesen Code versuche zu kompilieren,<br />
meldet mein Compiler diesen Fehler.<br />
Er bezieht sich auf die for() Zeile:</p>
<pre><code>In member function »void Adition::Util::Log&lt;string_type&gt;::operator()(const string_type&amp;) const«:
Fehler: expected »;« before »iter«
Fehler: »iter« wurde in diesem Gültigkeitsbereich nicht definiert
</code></pre>
<p>Compiler ist &quot;x86_64-pc-linux-gnu-4.4.3&quot;</p>
<p>Hab ich irgendwas grandios falsch gemacht? wenn ja was?<br />
Ich habe seit langem kein C++ mehr programmiert,<br />
kann mir aber hier absolut nicht weiterhelfen.</p>
<p>Grüße,<br />
Branleb</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/274455/unerklärliches-problem-beim-iterieren-über-std-list</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 10:42:43 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/274455.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 26 Sep 2010 16:28:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:40:22 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich habe folgenden Code [Auschnitt]</p>
<pre><code class="language-cpp">namespace Util
  {
    template &lt;typename string_type&gt; class Log
    {
      public:
        typedef Logger&lt;string_type&gt; logger_type; 
        typedef std::list&lt;logger_type*&gt; logger_list_type;

      private:
        Log()
        {
          this-&gt;loggers = new std::list&lt;logger_type*&gt;();
        }

        logger_list_type* loggers;

      public:
        void operator()(const string_type &amp; message) const
        {
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) {
            iter-&gt;logMessage(message);
          }
        }
    };

    template &lt;typename string_type&gt; class Logger
    {
      public: 
        virtual void logMessage(string_type &amp; message)
        {
        }
    };
  }
</code></pre>
<p>Wenn ich diesen Code versuche zu kompilieren,<br />
meldet mein Compiler diesen Fehler.<br />
Er bezieht sich auf die for() Zeile:</p>
<pre><code>In member function »void Adition::Util::Log&lt;string_type&gt;::operator()(const string_type&amp;) const«:
Fehler: expected »;« before »iter«
Fehler: »iter« wurde in diesem Gültigkeitsbereich nicht definiert
</code></pre>
<p>Compiler ist &quot;x86_64-pc-linux-gnu-4.4.3&quot;</p>
<p>Hab ich irgendwas grandios falsch gemacht? wenn ja was?<br />
Ich habe seit langem kein C++ mehr programmiert,<br />
kann mir aber hier absolut nicht weiterhelfen.</p>
<p>Grüße,<br />
Branleb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957733</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957733</guid><dc:creator><![CDATA[branleb]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:35:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#incluce &lt;list&gt;
</code></pre>
<p>Hast du?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957735</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957735</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:35:20 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:37:19 GMT]]></title><description><![CDATA[<p>Schreib mal <code>typename</code> vor <code>logger_list_type::iterator</code> .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957736</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957736</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:37:19 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:39:06 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">for(typename logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) {
    iter-&gt;logMessage(message);
}
</code></pre>
<p>Und &quot;loggers&quot; ist niergendwo deklariert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957738</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957738</guid><dc:creator><![CDATA[David_pb]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:39:06 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:39:22 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<pre><code class="language-cpp">#incluce &lt;list&gt;
</code></pre>
<p>Hast du?</p>
</blockquote>
<p>Jupp, klar habe ich die.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957739</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957739</guid><dc:creator><![CDATA[branleb]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:39:22 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:43:07 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Schreib mal <code>typename</code> vor <code>logger_list_type::iterator</code> .</p>
</blockquote>
<p>Das wars, vielen Dank.<br />
Hat mir zufällig jemand einen Link oder eine kurze Erklärung,<br />
warum das hier nötig ist?</p>
<p>Gruß,<br />
Branleb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957740</guid><dc:creator><![CDATA[branleb]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:43:07 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 16:47:22 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Schreib mal <code>typename</code> vor <code>logger_list_type::iterator</code> .</p>
</blockquote>
<p>Das wars, vielen Dank.<br />
Hat mir zufällig jemand einen Link oder eine kurze Erklärung,<br />
warum das hier nötig ist?</p>
<p>Gruß,<br />
Branleb</p>
</blockquote>
<p><a href="http://pages.cs.wisc.edu/~driscoll/typename.html" rel="nofollow">Warum man manchmal typename braucht</a>. Sehr gute Erklärung auf der Seite.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957742</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957742</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sun, 26 Sep 2010 16:47:22 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 17:13:04 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename string_type&gt; class Log
    {
      public:
        typedef Logger&lt;string_type&gt; logger_type; 
        typedef std::list&lt;logger_type*&gt; logger_list_type;
 
      private:
        Log()
        {
          this-&gt;loggers = new std::list&lt;logger_type*&gt;();
        }

        logger_list_type* loggers;

      public:
        void operator()(const string_type &amp; message) const
        {
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) {
            iter-&gt;logMessage(message);
          }
        }
    };
</code></pre>
</blockquote>
<p>Gibt es einen besonderen Grund, warum Du die Liste per new angelegt hast?<br />
(Tipp: Die Antwort ist &quot;Nein. Ich komme von Java und weiß es nicht besser.&quot;)</p>
<p>kk</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957746</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Sun, 26 Sep 2010 17:13:04 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Sun, 26 Sep 2010 17:17:39 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<p>Hat mir zufällig jemand einen Link oder eine kurze Erklärung,<br />
warum das hier nötig ist?</p>
</blockquote>
<p>Ganz kurze Erklärung: Der Compiler kann nicht wissen zu was <code>logger_list_type::iterator</code> aufgelöst wird. Es kann ein Typ oder z.B eine Funktion in einem Namespace sein. Darum musst du ihm mitteilen, dass es ein Typ ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1957753</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1957753</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 26 Sep 2010 17:17:39 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 18:44:14 GMT]]></title><description><![CDATA[<p>krümelkacker schrieb:</p>
<blockquote>
<p>branleb schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;typename string_type&gt; class Log
    {
      public:
        typedef Logger&lt;string_type&gt; logger_type; 
        typedef std::list&lt;logger_type*&gt; logger_list_type;
 
      private:
        Log()
        {
          this-&gt;loggers = new std::list&lt;logger_type*&gt;();
        }

        logger_list_type* loggers;

      public:
        void operator()(const string_type &amp; message) const
        {
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) {
            iter-&gt;logMessage(message);
          }
        }
    };
</code></pre>
</blockquote>
<p>Gibt es einen besonderen Grund, warum Du die Liste per new angelegt hast?<br />
(Tipp: Die Antwort ist &quot;Nein. Ich komme von Java und weiß es nicht besser.&quot;)</p>
<p>kk</p>
</blockquote>
<p>Ähh - nein. Ich komme nicht aus Java. Aber ja, ich weiß es ernsthaft nicht besser. Wie hätte ich sie anlegen sollen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958213</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958213</guid><dc:creator><![CDATA[branleb]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:44:14 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 18:50:42 GMT]]></title><description><![CDATA[<p>Die wird ganz automatisch im Konstruktor initialisiert.</p>
<p>Wenn du ein solches Objekt innerhalb einer Funktion definierst, dann machst du das ja auch so:</p>
<pre><code class="language-cpp">std::list&lt;int&gt; my_list;
</code></pre>
<p>Da brauchst du nichts weiteres. Du kannst natürlich in der Initialisierungsliste noch Konstruktorparameter übergeben, wenn du magst, aber ansonsten wird der Standardkonstruktor aufgerufen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958218</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958218</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 18:51:45 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<p>Ähh - nein. Ich komme nicht aus Java. Aber ja, ich weiß es ernsthaft nicht besser. Wie hätte ich sie anlegen sollen?</p>
</blockquote>
<p>Einfach als normaler Member:</p>
<pre><code class="language-cpp">template &lt;typename string_type&gt; class Log
    {
     // ...
      private:
        logger_list_type loggers;

    // ...
    };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1958219</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958219</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:51:45 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 18:58:03 GMT]]></title><description><![CDATA[<p>Das ist auch nur eine von vielen Unschönheiten in deinem Code. Verbesserungsvorschläge als Kommentar:</p>
<pre><code class="language-cpp">template &lt;typename string_type&gt; class Log 
    {
      // Warum public? Die Typen kommen nirgends in der Schnittstelle vor 
      public: 
        typedef Logger&lt;string_type&gt; logger_type; 

        // Nimm std::list&lt;logger_type&gt;
        typedef std::list&lt;logger_type*&gt; logger_list_type; 

      private:
        // Somit kann niemand ein Log-Objekt erstellen und benutzen
        // Mach den Konstruktor public oder schränke Zugriff spezifisch ein
        Log() 
        { 
          // Prinzipiell dienen Typedefs dazu, benutzt zu werden
          // Da du jetzt aber kein new verwendest, must du nichts tun
          // (höchstens ein loggers() in der Initialisierungsliste)
          this-&gt;loggers = new std::list&lt;logger_type*&gt;(); 
        } 

        // Nimm logger_list_type
        logger_list_type* loggers; 

      public: 
        void operator()(const string_type &amp; message) const 
        { 
          // typename logger_list_type::iterator
          // this ist unnötig und macht den bereits langen For-Header noch unübersichtlicher
          // ++iter statt iter++ spart unnötige Kopie
          // evtl. noch end() speichern statt jedes Mal zu prüfen
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) { 
            iter-&gt;logMessage(message); 
          } 
        } 
    };
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1958222</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958222</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Sep 2010 18:58:03 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 20:51:54 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Das ist auch nur eine von vielen Unschönheiten in deinem Code.</p>
</blockquote>
<p>Spricht wirklich was dagegen, die Liste auf dem Heap anzulegen?</p>
<p>Nexus schrieb:</p>
<blockquote>
<p>Verbesserungsvorschläge als Kommentar:</p>
<pre><code class="language-cpp">template &lt;typename string_type&gt; class Log 
    {
      // Warum public? Die Typen kommen nirgends in der Schnittstelle vor 
      public: 
        typedef Logger&lt;string_type&gt; logger_type; 

        // Nimm std::list&lt;logger_type&gt;
        typedef std::list&lt;logger_type*&gt; logger_list_type;
</code></pre>
</blockquote>
<p>hier nicht, aber der Code war auch nur ein auschnitt.<br />
logger type kam im interface drin vor.</p>
<p>Für logger_list_type hast du wohl recht, was das public angeht.<br />
Ich hatte aber ansonsten meine Gründe, Zeiger zu nehmen.<br />
Eventuell könnte ich das ganze auch über Referenzen machen,<br />
dass müsste ich erst noch prüfen.</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">private:
        // Somit kann niemand ein Log-Objekt erstellen und benutzen
        // Mach den Konstruktor public oder schränke Zugriff spezifisch ein
        Log() 
        { 
          // Prinzipiell dienen Typedefs dazu, benutzt zu werden
          // Da du jetzt aber kein new verwendest, must du nichts tun
          // (höchstens ein loggers() in der Initialisierungsliste)
          this-&gt;loggers = new std::list&lt;logger_type*&gt;(); 
        }
</code></pre>
</blockquote>
<p>Absicht, die Klasse Log stellt ein Singleton dar,<br />
die getInstance Methode hatte ich weggelassgen,<br />
weil sie für das Problem nicht relevant var.<br />
Es war eben nur ein Auschitt der Klasse.</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Nimm logger_list_type
        logger_list_type* loggers;
</code></pre>
</blockquote>
<p>Was spricht den dagegen, die Logger objekte auf dem Heap anzulegen und folglich eben einen Zeiger und new zu nehmen?</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">public: 
        void operator()(const string_type &amp; message) const 
        { 
          // typename logger_list_type::iterator
</code></pre>
</blockquote>
<p>Okay, das ist inzwischen klar warum, hab ich auch gemacht.</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// this ist unnötig und macht den bereits langen For-Header noch unübersichtlicher
</code></pre>
</blockquote>
<p>Ich habe mir this angwöhnt, um zu sichern, dass es um eine objektvariable geht.</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// ++iter statt iter++ spart unnötige Kopie
</code></pre>
</blockquote>
<p>Dann überspringe ich aber den ersten Logger oder?</p>
<p>Nexus schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// evtl. noch end() speichern statt jedes Mal zu prüfen
          for(logger_list_type::iterator iter = this-&gt;loggers-&gt;begin(); iter != this-&gt;loggers-&gt;end(); iter++) { 
            iter-&gt;logMessage(message); 
          } 
        } 
    };
</code></pre>
</blockquote>
<p>Ob end() zwischenspeichern so viel bringt?</p>
<p>Oder sind meine Einwände nicht berechtigt?<br />
Ich bin gern bereit zu lernen,<br />
aber ich würde gerne wissen, warum meine Gedanken dazu nicht richtig sind…</p>
<p>Gruß,<br />
Branleb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958259</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958259</guid><dc:creator><![CDATA[branleb]]></dc:creator><pubDate>Mon, 27 Sep 2010 20:51:54 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:08:49 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<p>Spricht wirklich was dagegen, die Liste auf dem Heap anzulegen?</p>
</blockquote>
<p>Wichtig ist die Unterscheidung zwischen dynamischer und automatischer Speicherverwaltung, nicht Heap und Stack. Gegenfrage: Spricht etwas gegen eine automatische Variable?</p>
<p>branleb schrieb:</p>
<blockquote>
<p>Ich hatte aber ansonsten meine Gründe, Zeiger zu nehmen.</p>
</blockquote>
<p>Was für Gründe? Manchmal sind Zeiger schon sinnvoll.</p>
<p>branleb schrieb:</p>
<blockquote>
<p>Eventuell könnte ich das ganze auch über Referenzen machen</p>
</blockquote>
<p>Nein.</p>
<p>branleb schrieb:</p>
<blockquote>
<p>Was spricht den dagegen, die Logger objekte auf dem Heap anzulegen und folglich eben einen Zeiger und new zu nehmen?</p>
</blockquote>
<p>Manuelle Speicherverwaltung und ihre Probleme, Geschwindigkeits- und Speicheroverhead, zusätzliche Indirektion. Und was spricht für dynamische Allokation?</p>
<p>branleb schrieb:</p>
<blockquote>
<p>Dann überspringe ich aber den ersten Logger oder?</p>
</blockquote>
<p>Nein. Schau dir nochmals die Bedeutung von Prä- und Postfixinkrement an.</p>
<p>branleb schrieb:</p>
<blockquote>
<p>Ob end() zwischenspeichern so viel bringt?</p>
</blockquote>
<p>Hängt von der Implementierung deiner Standardbibliothek ab. Wahrscheinlich wird es nicht viel bringen, darum &quot;evtl.&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958264</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958264</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:08:49 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:10:36 GMT]]></title><description><![CDATA[<p>branleb schrieb:</p>
<blockquote>
<p>Nexus schrieb:</p>
<blockquote>
<p>Das ist auch nur eine von vielen Unschönheiten in deinem Code.</p>
</blockquote>
<p>Spricht wirklich was dagegen, die Liste auf dem Heap anzulegen?</p>
</blockquote>
<p>Was spricht denn dafür?</p>
<p>Dagegen spricht, dass du dich um den Speicher selbst kümmern musst, die Exceptionsicherheit komplizierter umzusetzen macht und es völlig unnötig ist.</p>
<p>Prinzipiell sollten Variablen automatisch (ohne new; auf dem Stack) angelegt werden und nur wenn es nötig ist dynamisch. Warum? - Weil es einiges simpler zu handhaben, robuster und wahrscheinlich auch schneller ist.</p>
<blockquote>
<p>Dann überspringe ich aber den ersten Logger oder?</p>
</blockquote>
<p>Nein. Da wird einfach das Objekt inkrementiert und das neue zurückgegeben. Bei Postinkrement wird das alte Objekt zurückgegeben. Hier benutzt du den Rückgabewert sowieso nicht, also kannst du dir das auch gleich sparen.</p>
<blockquote>
<p>Ob end() zwischenspeichern so viel bringt?</p>
</blockquote>
<p>Sehr viel wahrscheinilch nicht, aber es bringt ein wenig was und es macht den Code auch ein wenig lesbarer.</p>
<p>~//EDIT: 4 Sekunden und wiedermal fast gleiche Antworten. :P~</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958265</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958265</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:18:56 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Sehr viel wahrscheinilch nicht, aber es bringt ein wenig was und es macht den Code auch ein wenig lesbarer.</p>
</blockquote>
<p>Nein, es macht ihn weniger lesbar.</p>
<pre><code class="language-cpp">for (Iterator itr = c.begin(); itr != c.end(); ++itr)
// vs
for (Iterator itr = c.begin(), end = c.end(); itr != end; ++itr)
</code></pre>
<p>Mehrere Zeilen will ich nicht verwenden. Aber ich hab mir dafür ein Makro gebastelt, wenn ich mal nicht <em>Boost.Foreach</em> benutzen kann. Und auch wenn ich es benutzen kann, habe ich bei &quot;ein paar Prozent&quot; Performance-Einbussen von <code>BOOST_FOREACH</code> ein mulmiges Gefühl. Bisher war es zum Glück noch nie das Performance-Problem. <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>P.S.: Ja, die ähnlichen Antworten... Mit dir ist es immer das Gleiche. <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/1958269</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958269</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:18:56 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:27:08 GMT]]></title><description><![CDATA[<p>Ich dachte dabei eher an so etwas:</p>
<pre><code class="language-cpp">logger_list_type::iterator begin = this-&gt;loggers-&gt;begin();
logger_list_type::iterator end = this-&gt;loggers-&gt;end();
for(logger_list_type::iterator iter = begin; iter != end; ++iter)
{
  iter-&gt;logMessage(message);
}
</code></pre>
<p>Finde ich persönlich besser lesbar. Es ist zwar mehr Text, aber bei sowas sehe ich sehr viel schneller was abgeht, als wenn ich zuerst wirklich schauen muss was im Schleifen Kopf steht.</p>
<p>Aber es ist natürlich ein zu grosser Aufwand für eine solche banale Sache. Ich erwarte sehnlichst das hier:</p>
<pre><code class="language-cpp">for(auto iter: this-&gt;loggers){
  iter-&gt;logMessage(message);
}
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958271</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:27:08 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:43:35 GMT]]></title><description><![CDATA[<p>Ich mag kleinen Code. Besonders bei Standardaufgaben wie Container-Iteration bin ich froh, nicht viel Boilerplate-Code schreiben und lesen zu müssen.</p>
<pre><code class="language-cpp">MY_FOREACH(Container, c, itr)
</code></pre>
<p>ist mir so viel lieber als</p>
<pre><code class="language-cpp">Container::iterator begin = c.begin();
Container::iterator end = c.end();
for (Container::iterator itr = begin; itr != end; ++itr)
</code></pre>
<p>Mal davon abgesehen, dass du unnötige Variablen erzeugst und den umliegenden Scope verschmutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1958273</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958273</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to Unerklärliches Problem beim Iterieren über std::list on Mon, 27 Sep 2010 21:59:09 GMT]]></title><description><![CDATA[<p>^^<br />
Ich habe nie das Gegenteil behauptet. Ich lass es meist drin und formatier es entsprechend, dann gehts auch mit der Lesbarkeit.</p>
<p>Ein Makro wäre eine Idee, aber irgendwie war das Bedürfnis noch nicht gross genug, dass ich mir da was zusammengebastelt habe. <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/1958277</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1958277</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Mon, 27 Sep 2010 21:59:09 GMT</pubDate></item></channel></rss>