<?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[private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt;]]></title><description><![CDATA[<p>Ich bin auf folgendes Problem gestoßen und wäre für Hinweise dankbar:</p>
<p>Ich möchte in einer von ofstream vererbten Klasse alle vererbten Methoden bis auf (alle Überladungen von) operator&lt;&lt; nach außen schützen.</p>
<p>Mein Ansatz ist:</p>
<p>class foo : protected std::ofstream{<br />
public:<br />
using std::ofstream::operator&lt;&lt;;<br />
foo(){...}<br />
};</p>
<p>und ich will damit folgendes anwenden können:</p>
<p>foo X;<br />
X &lt;&lt; &quot;test&quot; &lt;&lt; std:endl;<br />
bar(X); // wobei: void bar(ofstream&amp; ofs);<br />
X.close(); //verboten</p>
<p>Mit meinem Ansatz stoße ich auf<br />
»std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;« ist eine nicht erreichbare Basis von »foo«</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/284296/private-public-bei-vererbtem-operator-lt-lt</link><generator>RSS for Node</generator><lastBuildDate>Sat, 22 Aug 2026 04:32:36 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/284296.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 29 Mar 2011 16:17:25 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 16:17:25 GMT]]></title><description><![CDATA[<p>Ich bin auf folgendes Problem gestoßen und wäre für Hinweise dankbar:</p>
<p>Ich möchte in einer von ofstream vererbten Klasse alle vererbten Methoden bis auf (alle Überladungen von) operator&lt;&lt; nach außen schützen.</p>
<p>Mein Ansatz ist:</p>
<p>class foo : protected std::ofstream{<br />
public:<br />
using std::ofstream::operator&lt;&lt;;<br />
foo(){...}<br />
};</p>
<p>und ich will damit folgendes anwenden können:</p>
<p>foo X;<br />
X &lt;&lt; &quot;test&quot; &lt;&lt; std:endl;<br />
bar(X); // wobei: void bar(ofstream&amp; ofs);<br />
X.close(); //verboten</p>
<p>Mit meinem Ansatz stoße ich auf<br />
»std::basic_ostream&lt;char, std::char_traits&lt;char&gt; &gt;« ist eine nicht erreichbare Basis von »foo«</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041934</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Tue, 29 Mar 2011 16:17:25 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 16:33:18 GMT]]></title><description><![CDATA[<p>Nun, wie stellst du dir das vor, dass man aus X einen ofstream macht, wenn die ganzen Sachen die einen ofstream auszeichnen, private sind?</p>
<p>Außerdem wird <code>X&lt;&lt;&quot;test&quot;;</code> aus dem gleichen Grund nicht funktionieren, weil dieser Operator eine freie Funktion ist und deswegen nicht mit einem foo benutzt werden kann. Du dürftest stattdessen haufenweise ambigious overloads für die operator&lt;&lt;-Memberfunktionen bekommen.</p>
<p>Beschreib mal, was du erreichen willst und warum, dann kann man eine bessere Lösung finden. Willst du die Benutzung von open und close verbieten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041943</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041943</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 29 Mar 2011 16:33:18 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 17:55:13 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nun, wie stellst du dir das vor, dass man aus X einen ofstream macht, wenn die ganzen Sachen die einen ofstream auszeichnen, private sind?</p>
</blockquote>
<p>Ja, ich sehe ein, daß das Blödsinn ist.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Beschreib mal, was du erreichen willst und warum, dann kann man eine bessere Lösung finden.</p>
</blockquote>
<p>Im Grunde möchte ich einen ofstream gegen alle Veränderungen außer durch &quot;&lt;&lt;&quot; schützen.<br />
Momentan übergebe ich den ofstream an mehrere Funktionen, die alle in Wirklichkeit aber nichts anderes als &quot;&lt;&lt;&quot; auf den ofstream machen (sollten).<br />
Dabei hatte sich ein Fehler eingeschlichen, weil eine Funktion ein close() aufgerufen hat. Fehler dieser Art würde ich zukünftig gerne schon vom Compiler ausschließen lassen.</p>
<p>SeppJ schrieb:</p>
<blockquote>
<p>Willst du die Benutzung von open und close verbieten?</p>
</blockquote>
<p>Eigentlich möchte ich alles außer &quot;&lt;&lt;&quot; verbieten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041981</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041981</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Tue, 29 Mar 2011 17:55:13 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 18:07:28 GMT]]></title><description><![CDATA[<p>Mach's umgekehrt, verbiete die verbotenen Aktionen:</p>
<pre><code class="language-cpp">class foo : public std::ofstream{
public:
  void close();
}; 

void bar(std::ofstream&amp; ofs)
{
}

int main()
{
  foo X;
  X &lt;&lt; &quot;Test&quot; &lt;&lt;std::endl;  //Funktioniert
  bar(X);                   // Funktioniert
  X.close();                // Fehler
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2041985</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041985</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 29 Mar 2011 18:07:28 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 18:27:06 GMT]]></title><description><![CDATA[<p>Vielen Dank für deine Antwort.<br />
Ist zwar etwas mühselig, alle Member-Funktionen auf diese Art unbrauchbar zu machen, aber mein Ziel ereiche ich damit tatsächlich.</p>
<p>Gibt es einen Grund, warum du</p>
<pre><code>public:
  void close();
</code></pre>
<p>statt</p>
<pre><code>private:
  void close();
</code></pre>
<p>geschrieben hast?</p>
<p>Das zweite gefiele mir eigentlich besser, da ich dann schon beim Compilieren (und nicht erst beim Linken) einen Fehler beim falschen Aufruf bekomme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041994</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041994</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Tue, 29 Mar 2011 18:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 18:30:42 GMT]]></title><description><![CDATA[<p>thomas___ schrieb:</p>
<blockquote>
<p>Das zweite gefiele mir eigentlich besser, da ich dann schon beim Compilieren (und nicht erst beim Linken) einen Fehler beim falschen Aufruf bekomme.</p>
</blockquote>
<p>Nein, war nur Unachtsamkeit beim editieren, weil ich die Vorlage von oben bloß ein bisschen angepasst habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041996</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 29 Mar 2011 18:30:42 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Tue, 29 Mar 2011 18:32:07 GMT]]></title><description><![CDATA[<p>Prima, dann mache ich es so.</p>
<p>Nochmals vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2041998</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2041998</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Tue, 29 Mar 2011 18:32:07 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Wed, 30 Mar 2011 07:14:34 GMT]]></title><description><![CDATA[<p>Hmmm, leider ist das doch auch nicht ganz das, was ich wollte, weil</p>
<pre><code>X.std::ofstream::close();
</code></pre>
<p>ja immer noch möglich ist.</p>
<p>Gibt es noch andere Ansätze?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042135</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Wed, 30 Mar 2011 07:14:34 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Wed, 30 Mar 2011 07:23:01 GMT]]></title><description><![CDATA[<p>thomas___ schrieb:</p>
<blockquote>
<p>Hmmm, leider ist das doch auch nicht ganz das, was ich wollte, weil</p>
<pre><code>X.std::ofstream::close();
</code></pre>
<p>ja immer noch möglich ist.<br />
Gibt es noch andere Ansätze?</p>
</blockquote>
<p>Dagegen willst Du wirklich schützen? Dein Code ist doch nicht Fort Knox. Außerdem schreibe ich dann</p>
<pre><code class="language-cpp">reinterpret_cast&lt;std::ostream*&gt;(&amp;X)-&gt;close();//Nimm dies, Pursche!
</code></pre>
<p>Dagegen kannste pimpln? Nee.</p>
<pre><code class="language-cpp">(*reinterpret_cast&lt;std::ostream**&gt;(&amp;X))-&gt;close();//Jetzt erst recht, Pursche!
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2042138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042138</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Wed, 30 Mar 2011 07:23:01 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Wed, 30 Mar 2011 11:11:16 GMT]]></title><description><![CDATA[<p>Wie wär es wenn deine Wrapperklasse nur das definiert was erlaubt ist.</p>
<pre><code class="language-cpp">class Foo
{
public:
    Foo() : stream_(/*..*/)
    {

    }
    template&lt;typename T&gt;
    Foo&amp; in(T t)
    {
        stream_ &lt;&lt; t;
        return *this;
    }
    Foo&amp; in(std::ostream&amp;(*m)(std::ostream&amp;))
    {
        m(stream_);
        return *this;
    }
private:
    std::ostream stream_;
};

template&lt;typename T&gt;
Foo&amp; operator&lt;&lt;(Foo&amp; f, T t)
{
    return f.in(t);
}

Foo&amp; operator&lt;&lt;(Foo&amp; f, std::ostream&amp;(*m)(std::ostream&amp;))
{
    return f.in(m);
}

template&lt;typename Stream&gt;
void bar(Stream&amp; s)
{
 // ...
}

int main()
{
    Foo f;
    f &lt;&lt; 3 &lt;&lt; endl &lt;&lt; &quot;hallo&quot;;
    bar(f);
    return 0;
}
</code></pre>
<p>Foo ist dabei kein std::ostream, aber ist das denn wirklich gewollt?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042240</guid><dc:creator><![CDATA[brotbernd]]></dc:creator><pubDate>Wed, 30 Mar 2011 11:11:16 GMT</pubDate></item><item><title><![CDATA[Reply to private&#x2F;public bei vererbtem operator&amp;lt;&amp;lt; on Wed, 30 Mar 2011 16:09:51 GMT]]></title><description><![CDATA[<p>brotbernd schrieb:</p>
<blockquote>
<p>Foo ist dabei kein std::ostream, aber ist das denn wirklich gewollt?</p>
</blockquote>
<p>Das wollte ich eigentlich haben, da ich eben schon einige Funktionen der Form<br />
void bar(ostream&amp; s)<br />
habe, an die ich das Objekt übergeben möchte.</p>
<p>Trotzdem danke für den Hinweis; ich überlege mir, ob ich die Funktionen evtl. überlade.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2042248</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2042248</guid><dc:creator><![CDATA[thomas___]]></dc:creator><pubDate>Wed, 30 Mar 2011 16:09:51 GMT</pubDate></item></channel></rss>