<?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[Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte einem Objekt (Logger) die Möglichkeit geben, Istreams zu &quot;empfangen&quot;.</p>
<p>Es sollte schlussendlich möglich sein, auf das Objekt zu schreiben und diesen String in der Operator-Methode weiter zu verarbeiten.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">Logger &lt;&lt; &quot;Meldung xy loggen&quot;;
</code></pre>
<p>Ich habe verschiedenes schon über das Überschreiben der Stream-Operatoren gelesen. Aber etwas geht mir nicht auf:</p>
<p>Der Outstream-Operator <code>operator&lt;&lt;</code> ist sicher nicht der richtige Operator, da ich ja nicht den Logger ausgeben, sondern im Logger etwas empfangen will.</p>
<p>Der Istream-Operator operator&gt;&gt; scheint mir auch nicht der richtige zu sein. Schliesslich möchte ich <code>Obj &lt;&lt; &quot;String txt&quot;;</code> und nicht <code>&quot;String txt&quot; &gt;&gt; Obj</code> schreiben können.</p>
<p>Mit welchem Operator erreiche ich den gewünschten Effekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/245048/wie-auf-objekt-schreiben-gt-loggerobj-lt-lt-quot-schreib-das-auf-quot</link><generator>RSS for Node</generator><lastBuildDate>Fri, 18 Sep 2026 23:36:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/245048.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 09 Jul 2009 13:03:21 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:03:21 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Ich möchte einem Objekt (Logger) die Möglichkeit geben, Istreams zu &quot;empfangen&quot;.</p>
<p>Es sollte schlussendlich möglich sein, auf das Objekt zu schreiben und diesen String in der Operator-Methode weiter zu verarbeiten.</p>
<p>Bsp:</p>
<pre><code class="language-cpp">Logger &lt;&lt; &quot;Meldung xy loggen&quot;;
</code></pre>
<p>Ich habe verschiedenes schon über das Überschreiben der Stream-Operatoren gelesen. Aber etwas geht mir nicht auf:</p>
<p>Der Outstream-Operator <code>operator&lt;&lt;</code> ist sicher nicht der richtige Operator, da ich ja nicht den Logger ausgeben, sondern im Logger etwas empfangen will.</p>
<p>Der Istream-Operator operator&gt;&gt; scheint mir auch nicht der richtige zu sein. Schliesslich möchte ich <code>Obj &lt;&lt; &quot;String txt&quot;;</code> und nicht <code>&quot;String txt&quot; &gt;&gt; Obj</code> schreiben können.</p>
<p>Mit welchem Operator erreiche ich den gewünschten Effekt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739721</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739721</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:15:15 GMT]]></title><description><![CDATA[<p>op&lt;&lt; ist schon der richtige Operator. Denn dein Logger-Objekt empfängt zwar etwas, aber es dient logisch der Ausgabe. cout empfängt ja auch Daten, um sie dann auszugeben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739734</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739734</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:15:15 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:22:34 GMT]]></title><description><![CDATA[<p>Oder um es ganz einfach zu merken:<br />
Du schiebst etwas in den Logger rein also <code>operator &lt;&lt;</code> .</p>
<p>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739740</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739740</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:22:34 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:41:04 GMT]]></title><description><![CDATA[<p>Danke für eure Antworten.</p>
<p>Ich habe mich also gleich an die Implementation des &lt;&lt;operator gemacht.</p>
<p>Deklaration:</p>
<pre><code class="language-cpp">friend void operator &lt;&lt; (Logger&amp; log, const std::string&amp; str) const;
</code></pre>
<p>Implementation:</p>
<pre><code class="language-cpp">friend void Logger::operator &lt;&lt;(Logger&amp; log, const string &amp; str) const
    {
    	this.log(str.c_str());
    }
</code></pre>
<p>Und die Fehlermeldung dazu:</p>
<pre><code>Logger.h:46: error: non-member function 'void core::operator&lt;&lt;(core::Logger&amp;, const std::string&amp;)' cannot have cv-qualifier
</code></pre>
<p>Was ist ein <code>cv-qualifier</code> ?<br />
Die Deklaration ist doch richtig? Mit zwei Parameter <code>Logger</code> und <code>String</code> . Schliesslich ist bei</p>
<pre><code>logger &lt;&lt; &quot;blah&quot;
</code></pre>
<p>der linke Operand ein Logger und der rechte Operand ein String.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739758</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739758</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:41:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:50:20 GMT]]></title><description><![CDATA[<p>cv-qualifier: const oder volatile.</p>
<p>Das Problem ist, dass operator &lt;&lt; wohl kaum const sein wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739763</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739763</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:50:20 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 13:53:28 GMT]]></title><description><![CDATA[<p>Wie die Fehlermeldung bereits sagt, kann eine freie Funktion nicht const sein. Denn das const bezieht sich ja auf das umhüllende Objekt, das bei freien Funktionen nicht existiert.</p>
<p>Und this ist ein Zeiger.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739764</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739764</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 09 Jul 2009 13:53:28 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 14:02:54 GMT]]></title><description><![CDATA[<p>lies dir ma noch mal durch, was genau friend macht und wie man den op&lt;&lt; überlädt - das, was du dort machst, sieht sehr stark danach aus, als ob du weder das eine noch das andere wüsstest ^^</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739768</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739768</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 09 Jul 2009 14:02:54 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 14:40:04 GMT]]></title><description><![CDATA[<p>Michael E. schrieb:</p>
<blockquote>
<p>Wie die Fehlermeldung bereits sagt, kann eine freie Funktion nicht const sein. Denn das const bezieht sich ja auf das umhüllende Objekt, das bei freien Funktionen nicht existiert.</p>
<p>Und this ist ein Zeiger.</p>
</blockquote>
<p>Danke <em>Michael E.</em> &amp; <em>SeppJ</em>, wusste nicht das <code>cv-qualifier == const</code> gilt.<br />
Danke <em>unskilled</em>, dein Post hat mir und wohl auch anderen Lesern nix gebracht.</p>
<p>Habe das ganze nun zum Laufen gebracht:</p>
<p>Deklaration:</p>
<pre><code class="language-cpp">friend void operator&lt;&lt; (Logger&amp; log, const std::string&amp; str) ;
</code></pre>
<p>Implementation:</p>
<pre><code class="language-cpp">void operator &lt;&lt;(Logger&amp; log, const std::string &amp; str) {
	log.log(str.c_str());
}
</code></pre>
<p>Es sollte doch möglich sein diesen Operator auch als Member-Funktion (mit nur einem Parameter String) zu realisieren. Schliesslich ist der linke Operand keine fremde Klasse, sondern die Klasse Logger selbst. Oder liege ich da falsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739785</guid><dc:creator><![CDATA[maus_on_c]]></dc:creator><pubDate>Thu, 09 Jul 2009 14:40:04 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 14:49:44 GMT]]></title><description><![CDATA[<p>Was unskilled dir sagen wollte:</p>
<ol>
<li>
<p>Das friend vor der Funktionsdefinition ist unsinnig. In deinem letzten Post ist es richtig, sofern die Deklaration in der Klasse Logger steht.</p>
</li>
<li>
<p>operator&lt;&lt; gibt den Stream zurück, in den geschrieben wurde, um Folgendes zu ermöglichen:</p>
</li>
</ol>
<pre><code class="language-cpp">log &lt;&lt; &quot;Hallo&quot; &lt;&lt; &quot;Welt&quot;;
// wird umgewandelt in:
(operator&lt;&lt;(log, &quot;Hallo&quot;)).operator&lt;&lt;(log, &quot;Welt&quot;);
</code></pre>
<blockquote>
<p>Es sollte doch möglich sein diesen Operator auch als Member-Funktion (mit nur einem Parameter String) zu realisieren. Schliesslich ist der linke Operand keine fremde Klasse, sondern die Klasse Logger selbst. Oder liege ich da falsch</p>
</blockquote>
<p>Welchen Vorteil hättest du davon, wenn op&lt;&lt; ein Member wäre? Du schließt damit nur die implizierte Konvertierung des ersten Parameters in ein Logger-Objekt aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739794</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739794</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 09 Jul 2009 14:49:44 GMT</pubDate></item><item><title><![CDATA[Reply to Wie auf Objekt schreiben -&amp;gt; LoggerObj &amp;lt;&amp;lt; &amp;quot;Schreib das auf&amp;quot;; ? on Thu, 09 Jul 2009 15:58:28 GMT]]></title><description><![CDATA[<p>du brauchst das friend auch jetzt noch nicht - oder ist log(const char*) (unsinnigerweise) nicht public?<br />
ich nehm außerdem mal an, du arbeitest intern so und so mit nem ofstream, also:</p>
<pre><code class="language-cpp">class Logger
{
  std::ofstream stream;

//...
  template &lt;typename T&gt;
  void log(const T &amp;to_write)
  {
    stream &lt;&lt; to_write;
  }
};

template &lt;typename T&gt;
Logger&amp; operator&lt;&lt; (Logger &amp;s, const T &amp;in)
{
  s.log(in);
  return s;
}
</code></pre>
<p>oder (allerdings find ich konstrukte wie logger.log(asd).log(sdf).log(dfg) hässlich, deshalb würd ichs nicht so machen)</p>
<pre><code class="language-cpp">class Logger
{
  std::ofstream stream;

//...
  template &lt;typename T&gt;
  Logger&amp; log(const T &amp;to_write)
  {
    stream &lt;&lt; to_write;
    return *this;
  }
};

template &lt;typename T&gt;
Logger&amp; operator&lt;&lt; (Logger &amp;s, const T &amp;in)
{
  return s.log(in);
}
</code></pre>
<p>alternativ kannst du dir die log-fkt auch sparen - dann wirst du das friend brauchen - allerdings wär das nicht gerade sinnig...</p>
<p>bb</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1739867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1739867</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Thu, 09 Jul 2009 15:58:28 GMT</pubDate></item></channel></rss>