<?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[Übergabe von fstream im Konstruktor]]></title><description><![CDATA[<p>Servus,</p>
<p>ich beschäftge mich seit kurzem mit C++ und wollte eine Klasse Output erstellen, an die ich ein eine schon geöffnete Datei übergeben will. Ich hab mir gedacht ich probiere es mal so:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;

using namespace std;

struct Output {
  ofstream output;

  Output(ofstream *file) : output(*file) {}

  /** ... Funktion die in output hineinschreibt ... */
};

int main(int argc, char **argv)
{

  return 0;
}
</code></pre>
<p>... funzt aber nicht.</p>
<p>Warum nicht? Wie mache ich es anders?</p>
<p>Vielen Dank im Voraus,<br />
HarryKane</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/214884/übergabe-von-fstream-im-konstruktor</link><generator>RSS for Node</generator><lastBuildDate>Tue, 13 Oct 2026 03:28:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/214884.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Jun 2008 09:06:03 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:06:21 GMT]]></title><description><![CDATA[<p>Servus,</p>
<p>ich beschäftge mich seit kurzem mit C++ und wollte eine Klasse Output erstellen, an die ich ein eine schon geöffnete Datei übergeben will. Ich hab mir gedacht ich probiere es mal so:</p>
<pre><code class="language-cpp">#include &lt;fstream&gt;
#include &lt;iostream&gt;

using namespace std;

struct Output {
  ofstream output;

  Output(ofstream *file) : output(*file) {}

  /** ... Funktion die in output hineinschreibt ... */
};

int main(int argc, char **argv)
{

  return 0;
}
</code></pre>
<p>... funzt aber nicht.</p>
<p>Warum nicht? Wie mache ich es anders?</p>
<p>Vielen Dank im Voraus,<br />
HarryKane</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522302</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522302</guid><dc:creator><![CDATA[harrykane]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:06:21 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:10:05 GMT]]></title><description><![CDATA[<p>harrykane schrieb:</p>
<blockquote>
<p>... funzt aber nicht. ...</p>
</blockquote>
<p>Aha - ist heute wieder Ratestunde ?</p>
<p>Gruß,</p>
<p>Simon2.</p>
<p>P.S.: Analoge Frage: &quot;Ich möchte gerne nachhause fahren, aber das funzt nicht - warum nicht ?&quot;</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522310</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:10:05 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:16:49 GMT]]></title><description><![CDATA[<p>Simon2, sei mal nicht so hart, ist ja sein erster Beitrag hier. Aber hast natürlich schon recht <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="🙂"
    /></p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19412">@HarryKane</a>,<br />
Streams kann man nicht kopieren. Also musst du entweder eine Referenz oder Zeiger übergeben. Dabei aber beachten, dass der ursprüngliche Speicher nicht freigegeben wird, sonst knallt es <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522318</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522318</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:16:49 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:26:46 GMT]]></title><description><![CDATA[<p>Dravere schrieb:</p>
<blockquote>
<p>Simon2, sei mal nicht so hart, ist ja sein erster Beitrag hier. ...</p>
</blockquote>
<p>Dann ist ihm ja der <a href="http://www.c-plusplus.net/forum/viewtopic-var-t-is-200753.html" rel="nofollow">&quot;Du brauchst Hilfe ?&quot;-sticky-Thread</a> ja noch ganz frisch in Erinnerung.<br />
Außerdem ist &quot;Neusein&quot; kein echter Grund gegen simples Nachdenken. Das hat ja noch nichtmal was mit C++ oder Internet zu tun....</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522331</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522331</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:26:46 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:36:37 GMT]]></title><description><![CDATA[<p>Simon2 schrieb:</p>
<blockquote>
<p>Aha - ist heute wieder Ratestunde ?</p>
</blockquote>
<p>Sorry, kann dir gerne noch die Compilerausgabe hinzufügen, vllt wirst du daraus ja schlau:</p>
<pre><code>&gt; g++ test.cc -o test -lm
/usr/include/c++/4.1.2/bits/ios_base.h: In copy constructor ‘std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ios(const std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.1.2/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&amp;)’ is private
/usr/include/c++/4.1.2/iosfwd:55: error: within this context
/usr/include/c++/4.1.2/iosfwd: In copy constructor ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.1.2/iosfwd:92: note: synthesized method ‘std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ios(const std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here
/usr/include/c++/4.1.2/streambuf: In copy constructor ‘std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;::basic_filebuf(const std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.1.2/streambuf:781: error: ‘std::basic_streambuf&lt;_CharT, _Traits&gt;::basic_streambuf(const std::basic_streambuf&lt;_CharT, _Traits&gt;&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]’ is private
/usr/include/c++/4.1.2/iosfwd:86: error: within this context
/usr/include/c++/4.1.2/iosfwd: In copy constructor ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.1.2/iosfwd:92: note: synthesized method ‘std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;::basic_filebuf(const std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here
test.cc: In constructor ‘Output::Output(std::ofstream*)’:
test.cc:24: note: synthesized method ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here
</code></pre>
<p>Dravere schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/19412">@HarryKane</a>,<br />
Streams kann man nicht kopieren. Also musst du entweder eine Referenz oder Zeiger übergeben. Dabei aber beachten, dass der ursprüngliche Speicher nicht freigegeben wird, sonst knallt es <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>Grüssli</p>
</blockquote>
<p>Ich stehe gerade auf dem Schlauch, ich dachte ich übergebe hier einen Zeiger auf den ofstream? *dumm guck*</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522340</guid><dc:creator><![CDATA[harrykane]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:36:37 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:46:35 GMT]]></title><description><![CDATA[<p>Du übergibst einen Zeiger, aber konstruierst &quot;output&quot; per Copy-Konstruktor.<br />
Statt ein neues Objekt zu erstellen, verwende das Übergene.</p>
<p>Entweder mit Zeiger:</p>
<pre><code class="language-cpp">struct Output {
  ofstream* output;

  Output(ofstream *file) : output(file) {}
};
</code></pre>
<p>oder mit Referenz:</p>
<pre><code class="language-cpp">struct Output {
  ofstream&amp; output;

  Output(ofstream&amp; file) : output(file) {}
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1522348</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522348</guid><dc:creator><![CDATA[Airdamn]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:46:35 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 09:54:41 GMT]]></title><description><![CDATA[<p>Ok, danke, das klappt. Nun muss ich nur noch mal drüber meditieren, was ich da eigentlich mache <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="🙂"
    /> (Schlimm, wenn man immer nur über trial&amp;error lernt ...)</p>
<p>Vielen Dank auf jeden Fall für die schnelle Hilfe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522351</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522351</guid><dc:creator><![CDATA[harrykane]]></dc:creator><pubDate>Wed, 04 Jun 2008 09:54:41 GMT</pubDate></item><item><title><![CDATA[Reply to Übergabe von fstream im Konstruktor on Wed, 04 Jun 2008 11:25:50 GMT]]></title><description><![CDATA[<p>harrykane schrieb:</p>
<blockquote>
<p>...<br />
Sorry, kann dir gerne noch die Compilerausgabe hinzufügen, vllt wirst du daraus ja schlau:...</p>
</blockquote>
<p>Danke.</p>
<p>Ja - aber so schwer ist das auch nicht:</p>
<p>harrykane schrieb:</p>
<blockquote>
<p>...</p>
<pre><code>&gt; ...In copy constructor ...std::basic_ios...: error: ‘std::ios_base::ios_base(const std::ios_base&amp;)’ is private...
</code></pre>
</blockquote>
<p>Der Copy-Konstruktor ist private .... darf also von &quot;außen&quot; nicht aufgerufen werden. Das ist eine beliebte Technik, um das sicherzustellen, was Dravere formuliert hat: Die Dinger soll man nicht kopieren !<br />
Vermutlich versuchst Du das in Deinem Konstruktor so in der Art:</p>
<pre><code class="language-cpp">struct Output {
  ofstream output; // ein ofstream-Objekt

  Output(ofstream *file) : output(*file) {} // &lt;- Hier wird der ofstream-Copy-Construktor (ist nur ein &quot;Speziaslfall&quot; von basic_ios) aufgerufen, 
   // .. der wiederum den ios_base-Copy-Constructor aufruft, ...
   // .. der aber private ist
};
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<p>Im Gegensatz dazu hat Draveres Lösung genau ein Zeichen (* oder &amp;) an einer anderen Stelle, das den entscheidenden Unterschied macht:</p>
<pre><code class="language-cpp">struct Output {
  ofstream* output; // &lt;- Dein Output-Objekt hält einen ofstream-ZEIGER !!!
  Output(ofstream *file) : output(file) {} // &lt;- Hier wird nur ein Zeiger kopiert !! 
};
</code></pre>
<p>oder</p>
<pre><code class="language-cpp">struct Output {
  ofstream&amp; output; // &lt;- Dein Output-Objekt hält eine ofstream-REFERENZ !!!
  Output(ofstream&amp; file) : output(file) {} // &lt;- Hier wird nur eine Referenz initialisiert
};
</code></pre>
<p>...oder Mischformen davon (Referenz mit *file initialisiert oder Zeiger auf Adresse des referenzierten Objekts zeigern lassen).<br />
In keinem dieser Fälle wird der ofstream-Copy-Constructor verwendet.</p>
<p>(BTW: &quot;funzt net&quot; kann auch heißen &quot;compiliert fehlerlos aber macht was Anderes als ich erwartet habe&quot; oder &quot;Programm stürzt beim Start ab&quot; oder &quot;Lässt sich nicht auf dem PC meiner Freundin installieren&quot; oder ....)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1522404</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1522404</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Wed, 04 Jun 2008 11:25:50 GMT</pubDate></item></channel></rss>