<?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[Operator &amp;lt;&amp;lt; anpassen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte für folgende Logfile-Klasse einen &quot;&lt;&lt;&quot;-Operator einführen, der<br />
einfach auf den Stream des Files umleitet.</p>
<pre><code class="language-cpp">LogFile logfile;
logfile &lt;&lt; &quot;String und die Zahl &quot; &lt;&lt; 123 &lt;&lt; &quot;\n&quot;
</code></pre>
<pre><code class="language-cpp">class LogFile
{
protected:
	std::ofstream logStream;
};
</code></pre>
<p>Ich finde im Netz immer nur Beispiele, wie man eigene Klassen in einen Stream schreiben kann. Wie sollte mein Operator aussehen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/187209/operator-lt-lt-anpassen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 24 Sep 2026 15:06:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/187209.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 17 Jul 2007 06:45:28 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 06:45:28 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich möchte für folgende Logfile-Klasse einen &quot;&lt;&lt;&quot;-Operator einführen, der<br />
einfach auf den Stream des Files umleitet.</p>
<pre><code class="language-cpp">LogFile logfile;
logfile &lt;&lt; &quot;String und die Zahl &quot; &lt;&lt; 123 &lt;&lt; &quot;\n&quot;
</code></pre>
<pre><code class="language-cpp">class LogFile
{
protected:
	std::ofstream logStream;
};
</code></pre>
<p>Ich finde im Netz immer nur Beispiele, wie man eigene Klassen in einen Stream schreiben kann. Wie sollte mein Operator aussehen?</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326936</guid><dc:creator><![CDATA[stimpleton]]></dc:creator><pubDate>Tue, 17 Jul 2007 06:45:28 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 06:53:31 GMT]]></title><description><![CDATA[<p>Die primitive Lösung:</p>
<pre><code class="language-cpp">typedef std::ofstream LogFile;
</code></pre>
<p>Die direkte Lösung:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
LogFile&amp; operator&lt;&lt;(LogFile&amp; log,const T&amp; val)
{
  log.logStream&lt;&lt;val;
  return log;
}
//oder als Methode:
template&lt;typename T&gt;
LogFile&amp; LogFile::operator&lt;&lt;(const T&amp; val)
{
  logStream&lt;&lt;val;
  return *this;
}
</code></pre>
<p>Die bessere Variante ist es vermutlich, deine LogFile-Klasse in die IOStream-Hierarchie einzugliedern (dazu benötigst du eine eigene Stream-Buffer-Klasse als Ziel).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326941</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 06:53:31 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 07:20:51 GMT]]></title><description><![CDATA[<p>Beeindruckend. Das mit den Templates wäre mich wohl nicht eingefallen.<br />
Mir war wichtig, daß ich testen kann, ob das File wirklich offen ist.</p>
<p>Ist doch 'ne nützliche kleine Sache. Wer's mal ausprobieren will:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
using namespace std;

class LogFile
{
public:

	 LogFile() { logStream.open( &quot;logfile.txt&quot;, ios::out );	};
	~LogFile() { logStream.close(); };
	ofstream &amp;stream() { return logStream; };

	template&lt;typename T&gt; LogFile&amp; operator&lt;&lt;(const T&amp; val)
	{ 
		if(logStream) logStream&lt;&lt;val; 
		return *this; 
	};

protected:
	ofstream logStream;
};

int main()
{
	LogFile logfile;
	logfile &lt;&lt; &quot;Test&quot;;
}
</code></pre>
<p>Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326958</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326958</guid><dc:creator><![CDATA[stimpleton]]></dc:creator><pubDate>Tue, 17 Jul 2007 07:20:51 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 07:49:40 GMT]]></title><description><![CDATA[<p>stimpleton schrieb:</p>
<blockquote>
<p>Mir war wichtig, daß ich testen kann, ob das File wirklich offen ist.</p>
</blockquote>
<p>Also dafür reicht die Primitv-Variante mit dem typedef völlig aus (wenn du an einen nicht einsatzbereiten Stream Ausgaben schickst, ignoriert er sie einfach). Der einzige Vorteil deiner Klasse ist imho, daß sie automatisch ein File öffnet, wenn du ein Objekt anlegst (mit dem Nachteil, daß du sie nicht wie einen vollwertigen ostream verwenden kannst).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1326975</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1326975</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 17 Jul 2007 07:49:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 10:03:59 GMT]]></title><description><![CDATA[<p>Die vorgeschlagene Konstruktion kann z.B. keine Manipulatoren wie das übliche std::endl aufnehmen. Ändert die Template-Methode noch zu:</p>
<pre><code class="language-cpp">template&lt;typename T&gt; std::ostream&amp; operator&lt;&lt;(const T&amp; val)
    {
        return logStream &lt;&lt; val;        // if( logStream) .. ist nicht notwendig; das passiert intern sowieso
    };
</code></pre>
<p>dann funktioniert auch:</p>
<pre><code class="language-cpp">int main()
{
    LogFile logfile;
    logfile &lt;&lt; &quot;Test&quot; &lt;&lt; endl;
}
</code></pre>
<p>die einzige Einschränkung ist nur, dass ein Manipulator nicht unmittelbar hinter logfile stehen darf.</p>
<p>stimpleton schrieb:</p>
<blockquote>
<pre><code class="language-cpp">class LogFile
{
public:
	 LogFile() { logStream.open( &quot;logfile.txt&quot;, ios::out );	};
	~LogFile() { logStream.close(); };
</code></pre>
</blockquote>
<p>Besser:</p>
<pre><code class="language-cpp">class LogFile
{
public:
    LogFile() : logStream(&quot;logfile.txt&quot;) {}
    // kein Destruktor explizit angeben, da unnötig
</code></pre>
<p>.. der Destruktor von ofstream macht ohnehin alles richtig. Das gehört zu der Wesensart von C++ <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>
<p>Gruß<br />
Werner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327085</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327085</guid><dc:creator><![CDATA[Werner Salomon]]></dc:creator><pubDate>Tue, 17 Jul 2007 10:03:59 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Tue, 17 Jul 2007 11:28:18 GMT]]></title><description><![CDATA[<p>Werner Salomon schrieb:</p>
<blockquote>
<p>Die vorgeschlagene Konstruktion kann z.B. keine Manipulatoren wie das übliche std::endl aufnehmen.</p>
</blockquote>
<p>wieso?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327156</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 17 Jul 2007 11:28:18 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Wed, 18 Jul 2007 08:44:48 GMT]]></title><description><![CDATA[<p>Hallo,<br />
für die Standardmanipulatoren wie std::endl bedarf es Überladungen der Form:</p>
<pre><code class="language-cpp">LogFile&amp; operator&lt;&lt;(LogFile&amp; lf, std::ostream&amp; (*m)(std::ostream&amp;));
</code></pre>
<p>Ein einziges Template reicht da nicht, da std::endl eine überladene Funktion ist und T somit nicht eindeutig hergeleitet werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327590</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327590</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 18 Jul 2007 08:44:48 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Wed, 18 Jul 2007 09:27:25 GMT]]></title><description><![CDATA[<p>ja richtig. Hätte den Compiler anschmeißen sollen. Jedenfalls ist das besser als der andere Vorschlag.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327623</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327623</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 18 Jul 2007 09:27:25 GMT</pubDate></item><item><title><![CDATA[Reply to Operator &amp;lt;&amp;lt; anpassen on Wed, 18 Jul 2007 09:32:00 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>ja richtig. Hätte den Compiler anschmeißen sollen. Jedenfalls ist das besser als der andere Vorschlag.</p>
</blockquote>
<p>Ich bin mir allerdings nicht sicher, ob der Standard garantiert, dass die Manipulatoren als Funktionen implementiert sind (und habe gerade keinen Standard zur Hand, so dass ich nicht nachschauen kann). Habe bisher allerdings noch keine Standard-Lib-Impl gesehen, bei der der Ansatz nicht funktioniert hat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1327628</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1327628</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Wed, 18 Jul 2007 09:32:00 GMT</pubDate></item></channel></rss>