<?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[Problem bei Vererbung von std::ostringstream]]></title><description><![CDATA[<p>Ich versuche eine Klasse zu schreiben, die wie ein normaler ostream benutzt werden kann und die auf den ostream ausgegebenen Daten dann ins syslog schreibt.</p>
<p>Da ich die komplette syslog-Nachricht auf einmal schreiben muss, dachte ich, dass ich meine Klasse von std::ostringstream ableiten könnte, so dass die Klasse alle Ausgabe puffert und ich im Destruktor dann mit str() auslese was geschrieben wurde und das an den syslogd schicke. Dabei habe ich ein Problem, dass wenn als erstes ein String auf diese Klasse geschrieben wird, dass ich dann statt dem Text nur die Adresse an der der String steht geschrieben wird.</p>
<p>Ich habe meine Klasse mal auf das wesentliche reduziert:</p>
<pre><code>class logmessage : public std::ostringstream {
    public:
        ~logmessage() {
            std::clog &lt;&lt; &quot;Would write to syslog: &quot; &lt;&lt; str() &lt;&lt; std::endl;
        };

        static logmessage factory() {
            return logmessage();
        };

    private:
        logmessage() {
        };

        logmessage(const logmessage &amp;source) {
        };
};

int main() {
    logmessage::factory() &lt;&lt; &quot;Testmessage #&quot; &lt;&lt; 1 &lt;&lt; &quot; would be this&quot;;
}
</code></pre>
<p>Statt der erwarteten Ausgabe &quot;Would write to syslog: Testmessage #1 would be this&quot; bekomme ich ein &quot;Would write to syslog: 0x80493a01 would be this&quot;.</p>
<p>Wenn das erste was ausgegeben wird kein String (char*) ist, sondern z.B. ein int, dann funktioniert die Ausgabe wie ich sie haben möchte. Ich verstehe nicht, wieso es mit einem String nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/160509/problem-bei-vererbung-von-std-ostringstream</link><generator>RSS for Node</generator><lastBuildDate>Fri, 11 Sep 2026 08:06:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/160509.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Sep 2006 14:06:36 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 14:06:36 GMT]]></title><description><![CDATA[<p>Ich versuche eine Klasse zu schreiben, die wie ein normaler ostream benutzt werden kann und die auf den ostream ausgegebenen Daten dann ins syslog schreibt.</p>
<p>Da ich die komplette syslog-Nachricht auf einmal schreiben muss, dachte ich, dass ich meine Klasse von std::ostringstream ableiten könnte, so dass die Klasse alle Ausgabe puffert und ich im Destruktor dann mit str() auslese was geschrieben wurde und das an den syslogd schicke. Dabei habe ich ein Problem, dass wenn als erstes ein String auf diese Klasse geschrieben wird, dass ich dann statt dem Text nur die Adresse an der der String steht geschrieben wird.</p>
<p>Ich habe meine Klasse mal auf das wesentliche reduziert:</p>
<pre><code>class logmessage : public std::ostringstream {
    public:
        ~logmessage() {
            std::clog &lt;&lt; &quot;Would write to syslog: &quot; &lt;&lt; str() &lt;&lt; std::endl;
        };

        static logmessage factory() {
            return logmessage();
        };

    private:
        logmessage() {
        };

        logmessage(const logmessage &amp;source) {
        };
};

int main() {
    logmessage::factory() &lt;&lt; &quot;Testmessage #&quot; &lt;&lt; 1 &lt;&lt; &quot; would be this&quot;;
}
</code></pre>
<p>Statt der erwarteten Ausgabe &quot;Would write to syslog: Testmessage #1 would be this&quot; bekomme ich ein &quot;Would write to syslog: 0x80493a01 would be this&quot;.</p>
<p>Wenn das erste was ausgegeben wird kein String (char*) ist, sondern z.B. ein int, dann funktioniert die Ausgabe wie ich sie haben möchte. Ich verstehe nicht, wieso es mit einem String nicht funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144804</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144804</guid><dc:creator><![CDATA[mawis]]></dc:creator><pubDate>Tue, 26 Sep 2006 14:06:36 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 14:35:30 GMT]]></title><description><![CDATA[<p>logmessage::factory() ist ein rvalue. der operator &lt;&lt; für strings ist aber als freie funktion implementiert (und hat folglich eine referenz als linken parameter). dieser kann daher in diesem falle nicht verwendet werden. der operator&lt;&lt;, der ein void* nimmt, ist dagegen eine nichtstatische memberfunktion, und wird angewendet. allerdings sind streams ohnehin nicht kopierbar, insofern sollte bereits</p>
<pre><code class="language-cpp">static logmessage factory() {
            return logmessage();
        };
</code></pre>
<p>nicht kompilierbar sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144844</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144844</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Sep 2006 14:35:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 14:42:12 GMT]]></title><description><![CDATA[<p>Du solltest nicht vom stream erben, sondern diesen Kapseln.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144850</guid><dc:creator><![CDATA[THX 1138]]></dc:creator><pubDate>Tue, 26 Sep 2006 14:42:12 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 15:09:30 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>logmessage::factory() ist ein rvalue. der operator &lt;&lt; für strings ist aber als freie funktion implementiert (und hat folglich eine referenz als linken parameter). dieser kann daher in diesem falle nicht verwendet werden. der operator&lt;&lt;, der ein void* nimmt, ist dagegen eine nichtstatische memberfunktion, und wird angewendet.</p>
</blockquote>
<p>Okay, das ist ein Ansatz. Dann versuche ich mal, ob ich mit einen operator&lt;&lt; als member meiner logmessage-Klasse implementieren kann.</p>
<p>camper schrieb:</p>
<blockquote>
<p>allerdings sind streams ohnehin nicht kopierbar, insofern sollte bereits</p>
<pre><code class="language-cpp">static logmessage factory() {
            return logmessage();
        };
</code></pre>
<p>nicht kompilierbar sein.</p>
</blockquote>
<p>Deswegen habe ich mir ja einen eigenen Copyconstruktor eingefügt. In meiner Logging-Klasse übernehme ich da einfach den Logging-Level von der alten Instanz und akzeptiere, dass der ostringstream darunter einfach eine neue Instanz ist ohne Übernahme der Daten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144867</guid><dc:creator><![CDATA[mawis]]></dc:creator><pubDate>Tue, 26 Sep 2006 15:09:30 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 15:10:56 GMT]]></title><description><![CDATA[<p>1310-Logik schrieb:</p>
<blockquote>
<p>Du solltest nicht vom stream erben, sondern diesen Kapseln.</p>
</blockquote>
<p>Dann müsste ich für jeden Typen, den ich in einer Logmessage ausgeben will ja einen eigenen operator&lt;&lt; selbst definieren. Genau das will ich ja aber erben, dass die Ausgabe wir auf Standardstreams automatisch funktioniert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144868</guid><dc:creator><![CDATA[mawis]]></dc:creator><pubDate>Tue, 26 Sep 2006 15:10:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 15:22:19 GMT]]></title><description><![CDATA[<p>mawis schrieb:</p>
<blockquote>
<p>camper schrieb:</p>
<blockquote>
<p>logmessage::factory() ist ein rvalue. der operator &lt;&lt; für strings ist aber als freie funktion implementiert (und hat folglich eine referenz als linken parameter). dieser kann daher in diesem falle nicht verwendet werden. der operator&lt;&lt;, der ein void* nimmt, ist dagegen eine nichtstatische memberfunktion, und wird angewendet.</p>
</blockquote>
<p>Okay, das ist ein Ansatz. Dann versuche ich mal, ob ich mit einen operator&lt;&lt; als member meiner logmessage-Klasse implementieren kann.</p>
</blockquote>
<p>Ich habe jetzt die folgende Methode meiner Klasse hinzugefügt und nun funktioniert ist:</p>
<pre><code class="language-cpp">std::ostream &amp;operator&lt;&lt;(const char *text) {
            if (text == NULL)
                return *this;
            for (const char *ptr = text; *ptr != 0; ptr++)
                put(*ptr);
            return *this;
        }
</code></pre>
<p>Danke für die Hilfe!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144873</guid><dc:creator><![CDATA[mawis]]></dc:creator><pubDate>Tue, 26 Sep 2006 15:22:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 15:28:25 GMT]]></title><description><![CDATA[<p>mawis schrieb:</p>
<blockquote>
<p>Deswegen habe ich mir ja einen eigenen Copyconstruktor eingefügt.</p>
</blockquote>
<p>habe ich übersehen.</p>
<p>mawis schrieb:</p>
<blockquote>
<p>Ich habe jetzt die folgende Methode meiner Klasse hinzugefügt und nun funktioniert ist:</p>
<pre><code class="language-cpp">std::ostream &amp;operator&lt;&lt;(const char *text) {
            if (text == NULL)
                return *this;
            for (const char *ptr = text; *ptr != 0; ptr++)
                put(*ptr);
            return *this;
        }
</code></pre>
</blockquote>
<p>warum nicht durch den schon vorhandenen operator implementieren?</p>
<pre><code class="language-cpp">std::ostream &amp;operator&lt;&lt;(const char *text) {
            return static_cast&lt;std::ostream&amp;&gt;(*this) &lt;&lt; text;
        }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1144878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144878</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Sep 2006 15:28:25 GMT</pubDate></item><item><title><![CDATA[Reply to Problem bei Vererbung von std::ostringstream on Tue, 26 Sep 2006 15:41:56 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>warum nicht durch den schon vorhandenen operator implementieren?</p>
<pre><code class="language-cpp">std::ostream &amp;operator&lt;&lt;(const char *text) {
            return static_cast&lt;std::ostream&amp;&gt;(*this) &lt;&lt; text;
        }
</code></pre>
</blockquote>
<p>Ist natürlich schöner. Danke für den Tipp!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1144887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1144887</guid><dc:creator><![CDATA[mawis]]></dc:creator><pubDate>Tue, 26 Sep 2006 15:41:56 GMT</pubDate></item></channel></rss>