<?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[Den &amp;lt;&amp;lt; Operator überladen]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich bin gerade dabei eine kleine Klasse zu programmieren die mir bestimmte Sachen über WinApi Funktionen ausgibt.</p>
<p>Das sollte dann in etwa wie folgt aussehen:</p>
<pre><code class="language-cpp">cl_dbg dbg;
dbg &lt;&lt; &quot;x1&quot; &lt;&lt; &quot;x2&quot;;
</code></pre>
<p>Damit das so funktioniert, habe ich in meiner Klasse den Streamoperator überladen:</p>
<pre><code class="language-cpp">class cl_dbg {
  public:
    void operator&lt;&lt;(std::string text);
    ...
  private:
    ...
};

void cl_dbg::operator&lt;&lt;(std::string text)
{
  ...
  return;
}
</code></pre>
<p>Das funktioniert aber nur, wenn ich nur ein element mir &lt;&lt; ausgeben will. Wie kann ich den Operator so überladen, das Ausgaben wie im Beispiel von mir oben angegeben funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/155947/den-lt-lt-operator-überladen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 08 Sep 2026 17:14:26 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/155947.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 11 Aug 2006 12:09:06 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:09:06 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich bin gerade dabei eine kleine Klasse zu programmieren die mir bestimmte Sachen über WinApi Funktionen ausgibt.</p>
<p>Das sollte dann in etwa wie folgt aussehen:</p>
<pre><code class="language-cpp">cl_dbg dbg;
dbg &lt;&lt; &quot;x1&quot; &lt;&lt; &quot;x2&quot;;
</code></pre>
<p>Damit das so funktioniert, habe ich in meiner Klasse den Streamoperator überladen:</p>
<pre><code class="language-cpp">class cl_dbg {
  public:
    void operator&lt;&lt;(std::string text);
    ...
  private:
    ...
};

void cl_dbg::operator&lt;&lt;(std::string text)
{
  ...
  return;
}
</code></pre>
<p>Das funktioniert aber nur, wenn ich nur ein element mir &lt;&lt; ausgeben will. Wie kann ich den Operator so überladen, das Ausgaben wie im Beispiel von mir oben angegeben funktionieren?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115281</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115281</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:09:06 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:13:21 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class cl_dbg {
  public:
    cl_dbg&amp; operator&lt;&lt;(std::string text)
    {
      return *this;
    }

    ...
  private:
    ...
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115284</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115284</guid><dc:creator><![CDATA[GeorgV]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:23:43 GMT]]></title><description><![CDATA[<p>thk, so gehts</p>
<p>Allerdings habe ich noch eine Frage, wie kann ich etwas ähnliches wie std::endl selber bauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115290</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115290</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:23:43 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:27:05 GMT]]></title><description><![CDATA[<p>Mach dir doch einfach einen &quot;echten&quot; Stream. Ist wohl einfacher, als diese gesamte Infrastruktur nachzubauen.<br />
<a href="http://www.boost.org/libs/iostreams/doc/index.html" rel="nofollow">http://www.boost.org/libs/iostreams/doc/index.html</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115293</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115293</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:27:05 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:31:01 GMT]]></title><description><![CDATA[<p>Ne, ich glaube soviel brauch ich gar nicht.<br />
Ich bräuchte jetzt nur noch einen Tip wie ich meiner Klasse signalisieren kann, das jetzt die aktuelle Zeile zuende ist. Mehr brauch ich gar net. Wie ist das denn bei std::endl gemacht worden? Was ist std::endl eigentlich genau?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115298</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:31:01 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 12:34:58 GMT]]></title><description><![CDATA[<p>Ein &quot;echter&quot; Stream verwendet std::endl - das schreibt erst ein Newline-Zeichen '\n' und flusht anschließend den Ausgabepuffer (mit dem Ergebnis, daß die Daten aus dem Zwischenspeicher auf Festplatte oder Monitor geschrieben werden).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115301</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115301</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Fri, 11 Aug 2006 12:34:58 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 14:58:39 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<p>Hallo,</p>
<p>Ich bin gerade dabei eine kleine Klasse zu programmieren die mir bestimmte Sachen über WinApi Funktionen ausgibt.</p>
<p>Das sollte dann in etwa wie folgt aussehen:</p>
<pre><code class="language-cpp">cl_dbg dbg;
dbg &lt;&lt; &quot;x1&quot; &lt;&lt; &quot;x2&quot;;
</code></pre>
<p>Damit das so funktioniert, habe ich in meiner Klasse den Streamoperator überladen:</p>
<pre><code class="language-cpp">class cl_dbg {
  public:
    void operator&lt;&lt;(std::string text);
    ...
  private:
    ...
};

void cl_dbg::operator&lt;&lt;(std::string text)
{
  ...
  return;
}
</code></pre>
<p>Das funktioniert aber nur, wenn ich nur ein element mir &lt;&lt; ausgeben will. Wie kann ich den Operator so überladen, das Ausgaben wie im Beispiel von mir oben angegeben funktionieren?</p>
</blockquote>
<p>GeorgV schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class cl_dbg {
  public:
    cl_dbg&amp; operator&lt;&lt;(std::string text)
    {
      return *this;
    }

    ...
  private:
    ...
};
</code></pre>
</blockquote>
<p>flammenvogel schrieb:</p>
<blockquote>
<p>thk, so gehts</p>
<p>Allerdings habe ich noch eine Frage, wie kann ich etwas ähnliches wie std::endl selber bauen?</p>
</blockquote>
<p>Das soll funktionieren?<br />
operator &lt;&lt; für die Ausgabe muss ein &quot;externer&quot; Operator sein, möglicherweise friend deklariert, denn<br />
auf der linken Seite des Operators steht keine Instanz der Klasse. Das erste Argument ist ostream &amp;,<br />
das zweite eine Kopie oder eine konstante Referenz auf die Klasse. Der Operator gibt die Referenz auf<br />
den ostream im Argument als Rückgabewert zurück. Dies garantiert die Aufreibarkeit von &lt;&lt; .</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115427</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115427</guid><dc:creator><![CDATA[Helmut S.]]></dc:creator><pubDate>Fri, 11 Aug 2006 14:58:39 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 15:14:06 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<p>Allerdings habe ich noch eine Frage, wie kann ich etwas ähnliches wie std::endl selber bauen?</p>
</blockquote>
<pre><code class="language-cpp">cl_dbg &amp;myendl(cl_dbg&amp; stream)
{
    ....

    return stream
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115434</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115434</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 Aug 2006 15:14:06 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 15:25:29 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/527">@Helmut</a> S.:</p>
<p>Du meinst soetwas wie</p>
<pre><code class="language-cpp">#include &lt;ostream&gt;
#include &lt;iostream&gt;

using namespace std;

class vector {

    friend ostream&amp; operator&lt;&lt;( ostream&amp; os, vector &amp;v );

    private:

        int _x, _y;

    public:

        vector( int x, int y ) : _x( x ), _y( y ), x( _x ), y( _y ) { };
        vector( const vector &amp;other ) : _x( other.x ), _y( other.y ), x( _x ), y( _y ) { };
        ~vector( ) { };

        const int &amp;x, &amp;y;

        void set_x( int x ) { _x = x; }
        void set_y( int y ) { _y = y; }

        void set( int x, int y ) { _x = x; _y = y; }
};

ostream&amp; operator&lt;&lt;( ostream&amp; os, vector &amp;v )
{
    os &lt;&lt; &quot;[ &quot; &lt;&lt; v._x &lt;&lt; &quot;; &quot; &lt;&lt; v._y &lt;&lt; &quot; ]&quot;;
    return os;
}

int main( )
{
    vector v( 12, 3 );
    cout &lt;&lt; v &lt;&lt; endl;
}
</code></pre>
<p>? Das hat nichts mit dem vorliegenden Problem zu tum.</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115443</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Fri, 11 Aug 2006 15:25:29 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 15:32:45 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/10318">@CStoll</a>: Ich will den ganzen Kram nicht auf der Konsole oder in einer Datei ausgeben sondern in einem Windowslistenfeld, daher brauch ich nur flush bzw. newline (das ist im Fall einer Liste gleichwertig).</p>
<p>@HelmutS: Doch das funktioniert so, wie GeorgV es beschrieben hat. Und auch die Reihenfolge der Operanden spielt bei der von GregorV gepostet Lösung keine Geige. Ich habe mitlerfeile den &lt;&lt; Operator in der Klasse auch für int-Werte überladen und es funktioniert zuverlässig.</p>
<p>@Freak_Coder: Ich werds gleichmal ausprobieren (schonmal thk)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115450</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115450</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 15:32:45 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 15:47:20 GMT]]></title><description><![CDATA[<p>@Freak_Coder: Wenn ich jetzt</p>
<pre><code class="language-cpp">dbg &lt;&lt; &quot;bla&quot; &lt;&lt; &quot;bla&quot; &lt;&lt; myendl;
</code></pre>
<p>mache, dann bekomme ich vom Kompiler die Meldung:</p>
<pre><code>main.cpp:86: error: `myendl' undeclared (first use this function)
main.cpp:86: error: (Each undeclared identifier is reported only once for each function it appears in.)
:: === Build finished: 2 errors, 0 warnings ===
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115459</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 15:47:20 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 16:26:32 GMT]]></title><description><![CDATA[<p>Hmm, zeig mal mehr Code. Irgendwas hast du falsch gemacht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115494</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 Aug 2006 16:26:32 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 18:58:12 GMT]]></title><description><![CDATA[<p>Ich habe das Problem mal auf ein Minimalbeispiel reduziert:</p>
<pre><code class="language-cpp">//dbg.h
class dbgObject
{
    public:
        dbgObject();
        dbgObject operator&lt;&lt;(std::string);
        dbgObject operator&lt;&lt;(int zahl);
        dbgObject &amp;myendl(dbgObject&amp; stream);
        ...
    private:
        HWND hwnd_dbgWnd_;
        bool autoscroll_;
        ...
};

//dbg.cpp
dbgObject dbgObject::operator&lt;&lt;(std::string text)
{
    //Text hinzufügen
    SendDlgItemMessage(hwnd_dbgWnd_,IDD_DBG_LIST, LB_ADDSTRING,0,(LPARAM) text.c_str());

    //Nach unten scrollen
    if(autoscroll_)
        SendDlgItemMessage(hwnd_dbgWnd_,IDD_DBG_LIST,WM_VSCROLL,(WPARAM) SB_BOTTOM,0);

    return *this;
}

dbgObject dbgObject::operator&lt;&lt;(int zahl)
{
    std::stringstream str;
    str &lt;&lt; zahl;
    return operator&lt;&lt;(str.str());
}
dbgObject dbgObject::&amp;myendl(dbgObject&amp; stream)
{
    return stream;
}
</code></pre>
<p>Anmerkung 1: Ich habe die Klasse in dbgObject umbennant.<br />
Anmerkung 2: SendDlgItemMessage ist eine WinApi Funktion -&gt; windows.h</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115576</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115576</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 18:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 19:26:50 GMT]]></title><description><![CDATA[<p>flammenvogel schrieb:</p>
<blockquote>
<pre><code class="language-cpp">dbgObject dbgObject::&amp;myendl(dbgObject&amp; stream)
{
    return stream;
}
</code></pre>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/27a1.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--right_arrow"
      title=":arrow_right:"
      alt="➡"
    /></p>
<pre><code class="language-cpp">dbgObject&amp; dbgObject::myendl(dbgObject&amp; stream)
{
    return stream;
}
</code></pre>
<p><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="🙂"
    /> Ich hätte das &amp; normal lieber wie immer an den Datentyp hängen sollen, dann passieren solche Fehler auch nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115591</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115591</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Fri, 11 Aug 2006 19:26:50 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Fri, 11 Aug 2006 19:42:44 GMT]]></title><description><![CDATA[<p>Irgendwie funktioniert es in der abgeänderten Version auch net. (gleicher Fehler)</p>
<pre><code class="language-cpp">//dbg.h
class dbgObject
{
    public:
        dbgObject();
        dbgObject operator&lt;&lt;(std::string);
        dbgObject operator&lt;&lt;(int zahl);
        dbgObject&amp; myendl(dbgObject&amp; stream);
    private:
        HWND hwnd_dbgWnd_;
        bool autoscroll_;
};

//dbg.cpp
dbgObject dbgObject::operator&lt;&lt;(std::string text)
{
    //Text hinzufügen
    SendDlgItemMessage(hwnd_dbgWnd_,IDD_DBG_LIST, LB_ADDSTRING,0,(LPARAM) text.c_str());

    //Nach unten scrollen
    if(autoscroll_)
        SendDlgItemMessage(hwnd_dbgWnd_,IDD_DBG_LIST,WM_VSCROLL,(WPARAM) SB_BOTTOM,0);

    return *this;
}

dbgObject&amp; dbgObject::myendl(dbgObject&amp; stream)
{
    return stream;
}

dbgObject dbgObject::operator&lt;&lt;(int zahl)
{
    std::stringstream str;
    str &lt;&lt; zahl;
    return operator&lt;&lt;(str.str());
}
</code></pre>
<p>Kann ich mit deiner Version wirklich schreiben:</p>
<pre><code class="language-cpp">dbg &lt;&lt; &quot;test&quot; &lt;&lt; &quot;test&quot; &lt;&lt; myendl;
</code></pre>
<p>???</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115603</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115603</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Fri, 11 Aug 2006 19:42:44 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 06:59:26 GMT]]></title><description><![CDATA[<p>Ich glaube nicht, daß das so funktionieren kann. Dir fehlt ein Operator:</p>
<pre><code class="language-cpp">dbgObject&amp; dbgObject::operator&lt;&lt;(dbgObject&amp; (*pf)(dbgObject&amp;))
{
    return pf(*this);
}
</code></pre>
<p>Ungetested und von einem Coder, der so früh am Morgen noch nicht richtig wach ist. Also bitte mit Vorsicht und Nachsicht behandeln.</p>
<p>Edit: Soweit ich sehe fehlt dir bei den Rückgabetypen von operator&lt;&lt; überall die Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115774</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115774</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 12 Aug 2006 06:59:26 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 09:38:05 GMT]]></title><description><![CDATA[<p>Jaja, auf die Idee bin ich um 3:00 Uhr auch noch gekommen. Wenn ich so einen Operator habe, kann ich problemlos folgendes schreiben:</p>
<pre><code class="language-cpp">dbgObject dbg;
dbg &lt;&lt; &quot;test&quot; &lt;&lt; &quot;bla&quot; &lt;&lt; 4 &lt;&lt; &quot;bla&quot; &lt;&lt; dbg.Flush();
</code></pre>
<p>Hierbei enstehen allerdings zwei Probleme.</p>
<p>a) ist das immer noch nicht das was ich will und<br />
b) wird das ganze von hinten nach vorne abgearbeitet (zuerst wird geflusht und dann erst wird &quot;bla&quot; undsoweiter angefügt.</p>
<p>Als Alternativ (ich finds nicht wirklich schön) ginge ohne den Operator auch noch:</p>
<pre><code class="language-cpp">(dbg &lt;&lt; &quot;Test&quot; &lt;&lt; &quot;Test&quot;).Flush()
</code></pre>
<p>Allerdings bleibt mein Problem das gleiche, weiß jemand nähres darüber wie das bei std::endl geht? (Oder noch besser, wie ich eins nachbauen kann?)</p>
<p>//edit: Vieleicht sollte ich die Dekleration von Flush auch mal mit angeben:</p>
<pre><code class="language-cpp">dbgObject&amp; Flush(); //Member von dbgObject,public
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1115822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115822</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Sat, 12 Aug 2006 09:38:05 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 09:50:42 GMT]]></title><description><![CDATA[<p>Dieses Flush ist bloß eine gewöhnlich Member-Funktion, die vermutlich von der endl-Funktion aufgerufen wird und mit dem Manipulator, den du schreiben willst, eigentlich nichts zu tun hat.</p>
<p>Wo ist dein Problem? Hast du es überhaupt mal ausprobiert:</p>
<p>dbg &lt;&lt; myendl;</p>
<p>Das müßte damit theoretisch funktionieren. Der endl-Manipulator der Stream-Library ist nämlich auf genau dieselbe Weise implementiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115839</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115839</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 12 Aug 2006 09:50:42 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 10:14:46 GMT]]></title><description><![CDATA[<p>Hmm, ich hab das mit den Referenzen geändert. Allerdings funktioniert es bei mir irgendwie immer noch nicht. Könnte jemmand von euch den geposten Code mal testen und checken ob der so lauffähig ist?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115864</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115864</guid><dc:creator><![CDATA[flammenvogel]]></dc:creator><pubDate>Sat, 12 Aug 2006 10:14:46 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 10:25:10 GMT]]></title><description><![CDATA[<p>Noch ein Fehler entdeckt: Das myendl muß eine freie Funktion sein, keine Memberfunktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115876</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115876</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 12 Aug 2006 10:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 11:05:42 GMT]]></title><description><![CDATA[<p>ich würd's so machen:</p>
<pre><code class="language-cpp">#include &lt;string&gt;
#include &lt;sstream&gt;

#define UNICODE
#define _UNICODE

#include &lt;windows.h&gt;

using namespace std;

typedef basic_string&lt; wchar_t, char_traits&lt; wchar_t &gt; &gt;        wstring_t;
typedef basic_stringstream&lt; wchar_t, char_traits&lt; wchar_t &gt; &gt;   wstringstream_t;

const unsigned int edit_control_id = 100;

class debug_stream_t {

    private:

        HWND edit_control;

    public:

        const wstring_t endl;

        debug_stream_t( ) : edit_control ( 0 ), endl( L&quot;\r\n&quot; ) { };

        debug_stream_t( HWND edit ) : edit_control( edit ), endl( L&quot;\r\n&quot; ) 
        {
            clear( );
        }

        HWND set_edit_control( HWND edit )
        {
            HWND temp = edit_control;
            edit_control = edit;
            return temp;
        }

        void clear( )
        {
            if( !edit_control ) {

                return;
            }

#           pragma warning( disable : 4311 )
            SendMessage( edit_control, WM_SETTEXT, 0, reinterpret_cast&lt; long &gt;( L&quot;&quot; ) );
#           pragma warning( default : 4311 )

            SendMessage( edit_control, EM_EMPTYUNDOBUFFER, 0, 0 );
        }

        debug_stream_t&amp; operator&lt;&lt;( debug_stream_t &amp;ds )
        {
            return ds;
        }

        debug_stream_t&amp; operator&lt;&lt;( const wstring_t &amp;str )
        {
            long length = static_cast&lt; long &gt;( SendMessage( edit_control, WM_GETTEXTLENGTH, 0, 0 ) + 1 );

            wchar_t *backup_text;

            if( length &gt; 1 ) {

                try {

                    backup_text = new wchar_t[ length * sizeof( wchar_t ) ];

                } catch( bad_alloc &amp;e ) {

                    throw e;
                }

#               pragma warning( disable : 4311 )
                SendMessage( edit_control, WM_GETTEXT, length, reinterpret_cast&lt; long &gt;( backup_text ) );
#               pragma warning( default : 4311 )

            } else {

                backup_text = L&quot;&quot;;
            }

            wstring_t text = backup_text + str;

#           pragma warning( disable : 4311 )
            SendMessage( edit_control, WM_SETTEXT, 0, reinterpret_cast&lt; long &gt;( text.c_str( ) ) );
#           pragma warning( default : 4311 )

            if( length &gt; 1 ) {

                delete [ ] backup_text;
            }

            return *this;
        }

        debug_stream_t&amp; operator&lt;&lt;( const wchar_t &amp;ch )
        {
            wstringstream_t wss;
            wss &lt;&lt; ch;

            return operator&lt;&lt;( wss.str( ) );
        }

        debug_stream_t&amp; operator&lt;&lt;( const int &amp;i )
        {
            wstringstream_t wss;
            wss &lt;&lt; i;

            return operator&lt;&lt;( wss.str( ) );
        }

};

long __stdcall main_window_proc( HWND window, unsigned int message, unsigned int first, long second )
{
    static HWND             edit_control;
    static debug_stream_t   debug_stream;

    switch( message ) {

        case WM_CREATE:

#           pragma warning( disable : 4312 )
            edit_control = CreateWindow(   L&quot;EDIT&quot;,
                                           0,
                                           WS_CHILD | WS_VISIBLE | WS_BORDER | ES_AUTOVSCROLL |
                                           ES_LEFT | ES_MULTILINE | ES_NOHIDESEL | ES_READONLY,
                                           10, 10, 572, 354,
                                           window,
                                           reinterpret_cast&lt; HMENU &gt;( edit_control_id ),
                                           GetModuleHandle( 0 ),
                                           0
            );
#           pragma warning( default : 4312 )

            if( !edit_control ) {

                return -1;
            }

            debug_stream.set_edit_control( edit_control );

            debug_stream &lt;&lt; wstring_t( L&quot;Hello,&quot; ) &lt;&lt; debug_stream.endl;
            debug_stream &lt;&lt; wstring_t( L&quot;debug&quot; ) &lt;&lt; wstring_t( L&quot;_stream_t!&quot; ) &lt;&lt; debug_stream.endl;
            debug_stream &lt;&lt; wstring_t( L&quot;an Integer: &quot; ) &lt;&lt; 10 &lt;&lt; debug_stream.endl;

            return 0;

        case WM_CLOSE:

            PostQuitMessage( 0 );
            return 0;
    }

    return static_cast&lt; long &gt;( DefWindowProc( window, message, first, second ) );
}

int __stdcall WinMain( HINSTANCE instance, HINSTANCE prev_instance, char *cmd_line, int show_state )
{
    wchar_t main_window_name[ ]         = L&quot;debug stream - Sample&quot;;
    wchar_t main_window_class_name[ ]   = L&quot;debug_stream_sample_window_class&quot;;

    WNDCLASS wc;
    memset( &amp;wc, 0, sizeof( WNDCLASS ) );

    wc.lpszClassName    = main_window_class_name;
    wc.hInstance        = instance;
    wc.style            = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc      = main_window_proc;
    wc.hIcon            = LoadIcon( 0, IDI_APPLICATION );
    wc.hCursor          = LoadCursor( 0, IDC_ARROW );
    wc.hbrBackground    = reinterpret_cast&lt; HBRUSH &gt;( COLOR_APPWORKSPACE + 1 );

    if( !RegisterClass( &amp;wc ) ) {

        MessageBox( 0, L&quot;Could not register Window-Class!&quot;, L&quot;Error:&quot;, MB_OK );
        return EXIT_FAILURE;
    }

    HWND main_window = CreateWindow(    main_window_class_name,
                                        main_window_name,
                                        WS_OVERLAPPEDWINDOW,
                                        CW_USEDEFAULT,
                                        CW_USEDEFAULT,
                                        600, 400,
                                        0, 0,
                                        instance,
                                        0
    );

    if( !main_window ) {

        UnregisterClass( main_window_class_name, instance );
        MessageBox( 0, L&quot;Could not create the main window!&quot;, L&quot;Error:&quot;, MB_OK );
        return EXIT_FAILURE;
    }

    UpdateWindow( main_window );
    ShowWindow( main_window, show_state );

    MSG msg;

    while( GetMessage( &amp;msg, main_window, 0, 0 ) ) {

        TranslateMessage( &amp;msg );
        DispatchMessage( &amp;msg );
    }

    return static_cast&lt; int &gt;( msg.wParam );
}
</code></pre>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115909</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115909</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 12 Aug 2006 11:05:42 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 12:00:52 GMT]]></title><description><![CDATA[<p>Wieso soll myendl ne Funktion sein? Dafür gibts doch enums.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115955</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115955</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Sat, 12 Aug 2006 12:00:52 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 13:04:45 GMT]]></title><description><![CDATA[<p>Die Idee war es ähnlich wie bei den Standard Stream-Klassen zu machen. Und da ist endl nun mal gewöhnlich eine Funktion.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115984</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 12 Aug 2006 13:04:45 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 13:09:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/11589">@Z2</a>: und für welchen Nutzen?</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115989</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115989</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 12 Aug 2006 13:09:38 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 13:18:04 GMT]]></title><description><![CDATA[<p>Zu welchem Nutzen? Damit man soetwas:</p>
<pre><code class="language-cpp">std::cout &lt;&lt; std::endl;
</code></pre>
<p>schreiben kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1115998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1115998</guid><dc:creator><![CDATA[Z2]]></dc:creator><pubDate>Sat, 12 Aug 2006 13:18:04 GMT</pubDate></item><item><title><![CDATA[Reply to Den &amp;lt;&amp;lt; Operator überladen on Sat, 12 Aug 2006 13:27:05 GMT]]></title><description><![CDATA[<p>Guckst du mein Beispiel oben? Kann ich auch und brauche keine Funktion.<br />
War diese Klasse nicht, was der OP wollte? Siehst du darin einen Nachteil?</p>
<p>Greetz, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1116003</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1116003</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sat, 12 Aug 2006 13:27:05 GMT</pubDate></item></channel></rss>