<?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[Funktionen und Definition - Trennung in Headern]]></title><description><![CDATA[<p>So ihr lieben ...</p>
<p>da gibts doch tatsächlich noch einen Thread von mir <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="😃"
    /> <em>ich hoffe, ich trolle für euch nicht auch noch rum ....</em> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Es geht um das Auslagern von Klassenfunktionen in Header Dateien.<br />
Interessanterweise - ich hätte es nicht erwartet - muss/soll ich die Konstruktoranweisungen auslagern ...<br />
Aber den Zuweisungsoperator krieg ich nicht raus.</p>
<p><strong>Header.h</strong></p>
<pre><code>#ifndef HEADER1_H
#define HEADER1_H

class A {
public:
    A(const int dx, const int dy);
    A(const A&amp; einA);
    A &amp;operator=(A einA)  {swapi(einA); return *this;}  // bekommt man das auch ausgelagert?
    void swapi(A&amp; einA);
    int getX() const;
    int getY() const;
private:
    int x;
    int y;
};

#endif // HEADER1_H
</code></pre>
<p><strong>Header.cpp</strong></p>
<pre><code>#include &quot;header.h&quot;

A::A(const int dx, const int dy) : x(dx), y(dy) {}
A::A(const A&amp; einA) :x(einA.x), y(einA.y) {}
int A::getX() const {return x;}
int A::getY() const {return y;}
void A::swapi(A&amp; einA) {
    std::swap(x,einA.x);
    std::swap(y,einA.y);
}
</code></pre>
<p>Eine Frage noch zu den Namensbereichen:<br />
Alle meine Funktionen - auch wenn sie in Headern ausgelagert sind - sind global in allen Dateien verfügbar? Und das kann das durch static oder namespace einschränken, oder?</p>
<p>Was ist aber mit globalen Variablen? Sind die nur in der ausgelagerten Datei zugänglich?<br />
Zb eine <code>std::ofstream Output(&quot;output.txt&quot;);</code> möchte ich immer zur Verfügung haben (Anm. Soll da lieber auch ein const vor?).<br />
Aber der ofstream ist ja - so wie es da steht - inklusive Initialisierung. Wo sollen diese rein, in die Header.h oder in die Header.cpp oder kurz vor main stehen lassen?</p>
<p>Ein großes Dankeschön! <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>
]]></description><link>https://www.c-plusplus.net/forum/topic/321207/funktionen-und-definition-trennung-in-headern</link><generator>RSS for Node</generator><lastBuildDate>Wed, 22 Jul 2026 00:02:38 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/321207.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 27 Oct 2013 21:49:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Sun, 27 Oct 2013 21:49:29 GMT]]></title><description><![CDATA[<p>So ihr lieben ...</p>
<p>da gibts doch tatsächlich noch einen Thread von mir <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="😃"
    /> <em>ich hoffe, ich trolle für euch nicht auch noch rum ....</em> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Es geht um das Auslagern von Klassenfunktionen in Header Dateien.<br />
Interessanterweise - ich hätte es nicht erwartet - muss/soll ich die Konstruktoranweisungen auslagern ...<br />
Aber den Zuweisungsoperator krieg ich nicht raus.</p>
<p><strong>Header.h</strong></p>
<pre><code>#ifndef HEADER1_H
#define HEADER1_H

class A {
public:
    A(const int dx, const int dy);
    A(const A&amp; einA);
    A &amp;operator=(A einA)  {swapi(einA); return *this;}  // bekommt man das auch ausgelagert?
    void swapi(A&amp; einA);
    int getX() const;
    int getY() const;
private:
    int x;
    int y;
};

#endif // HEADER1_H
</code></pre>
<p><strong>Header.cpp</strong></p>
<pre><code>#include &quot;header.h&quot;

A::A(const int dx, const int dy) : x(dx), y(dy) {}
A::A(const A&amp; einA) :x(einA.x), y(einA.y) {}
int A::getX() const {return x;}
int A::getY() const {return y;}
void A::swapi(A&amp; einA) {
    std::swap(x,einA.x);
    std::swap(y,einA.y);
}
</code></pre>
<p>Eine Frage noch zu den Namensbereichen:<br />
Alle meine Funktionen - auch wenn sie in Headern ausgelagert sind - sind global in allen Dateien verfügbar? Und das kann das durch static oder namespace einschränken, oder?</p>
<p>Was ist aber mit globalen Variablen? Sind die nur in der ausgelagerten Datei zugänglich?<br />
Zb eine <code>std::ofstream Output(&quot;output.txt&quot;);</code> möchte ich immer zur Verfügung haben (Anm. Soll da lieber auch ein const vor?).<br />
Aber der ofstream ist ja - so wie es da steht - inklusive Initialisierung. Wo sollen diese rein, in die Header.h oder in die Header.cpp oder kurz vor main stehen lassen?</p>
<p>Ein großes Dankeschön! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363370</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Sun, 27 Oct 2013 21:49:29 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Sun, 27 Oct 2013 21:54:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">A &amp;operator=(A einA)  {swapi(einA); return *this;}  // bekommt man das auch ausgelagert?
</code></pre>
<p>Gehen wir das logisch an.</p>
<p>Rückgabetyp: A&amp;<br />
Parameterliste: (A einA)<br />
Also muss gelten Funktionsname: operator=</p>
<p>Im cpp ist es immer:<br />
Rückgabetyp Klassenname::Funktionsname Parameterliste</p>
<p>Also</p>
<pre><code class="language-cpp">A &amp;A::operator=(A einA)
{swapi(einA); return *this;}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2363372</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363372</guid><dc:creator><![CDATA[teilantwort]]></dc:creator><pubDate>Sun, 27 Oct 2013 21:54:20 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Sun, 27 Oct 2013 22:00:04 GMT]]></title><description><![CDATA[<p>Oh schön! <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="🙂"
    /> Das funktioniert! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Danke für die tolle Erläuterung <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363374</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Sun, 27 Oct 2013 22:00:04 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 00:09:14 GMT]]></title><description><![CDATA[<p>teilantwort schrieb:</p>
<blockquote>
<p>Im cpp ist es immer:<br />
Rückgabetyp Klassenname::Funktionsname Parameterliste</p>
</blockquote>
<p>Zeig mal wie das aussieht wenn der Rückgabetyp ein Funktionszeiger ist, sagen wir z.B. <code>void(*)(int, int)</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363383</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363383</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 28 Oct 2013 00:09:14 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 00:36:17 GMT]]></title><description><![CDATA[<p>hustbaer schrieb:</p>
<blockquote>
<p>teilantwort schrieb:</p>
<blockquote>
<p>Im cpp ist es immer:<br />
Rückgabetyp Klassenname::Funktionsname Parameterliste</p>
</blockquote>
<p>Zeig mal wie das aussieht wenn der Rückgabetyp ein Funktionszeiger ist, sagen wir z.B. <code>void(*)(int, int)</code> <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
</blockquote>
<p>void (*Klassenname::Funktionsname Parameterliste)(int,int) <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /><br />
Da würde man aber für den Rückgabetypen ein hoffentlich typedef nehmen, dann stimmt die Aussage sogar wieder.<br />
typedef void(*Rückgabetyp)(int, int);<br />
Rückgabetyp Klassenname::Funktionsname Parameterliste</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363388</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363388</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Oct 2013 00:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 05:46:40 GMT]]></title><description><![CDATA[<p>Der Linker kümmert sich um die Funktionsdefinitionen, so dass jeder die verwenden kamn.<br />
Mit static und anonymem namespace kannste das verhindern, dann aber nur für Hilfsfunktionen, dire nur ein Sourcefile braucht. Nie im Header!<br />
Wenn nur die Klasse A den Output als Hilfsmittel braucht -&gt; anonymer namespace.<br />
Besser ist es aber den als Parameter mitzugeben, dann kann diemain ändern, wohin ausgegeben wird.<br />
Kein const bei Streams, dann kannste nichts ausgeben!<br />
Aproppos Ausgabe: Sagt dir der Steamoutputoperator etwas? Wenn nicht, solltest du dich mal darin ei.lesen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363399</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Oct 2013 05:46:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 08:13:25 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Nie im Header!</p>
</blockquote>
<p>Meistens nie.<br />
Naja.<br />
Alle Generalisierungen sind falsch. Besonders die mit Rufzeichen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363410</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 28 Oct 2013 08:13:25 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 08:27:40 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Nathan schrieb:</p>
<blockquote>
<p>Nie im Header!</p>
</blockquote>
<p>Meistens nie.<br />
Naja.<br />
Alle Generalisierungen sind falsch. Besonders die mit Rufzeichen!</p>
</blockquote>
<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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363415</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363415</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Oct 2013 08:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 11:46:46 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Steamoutputoperator</p>
</blockquote>
<p>Meinst du, dass ich mit<br />
Output &lt;&lt; variable &lt;&lt; &quot;Text&quot;;<br />
das genauso füllen kann wie bei cout? Das ist da ja dann schon überladen.</p>
<p>Vielen Dank für eure Antworten. <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>Wenn ich jetzt zwei Klassen hätte und die andere Klasse B hätte Objekte von A (oder wäre eine Ableitung). Müssen diese Klassen in die selbe Datei oder in andere Headern?<br />
Ich hab probeweise die erste Klasse ausgelagert, den Rest in der main.cpp gelassen. Der Compiler sagt, er würde die Klasse A nicht kennen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Liegt es vielleicht an der Reihenfolge, in der er die linkt? Der Header ist aber überall eingebunden, eigentlich müsste main.cpp sagen &quot;brauche A, haben den Rest&quot; und header &quot;habe A, brauche nix&quot; ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Bei dem Minimalbeispiel, was hier steht, klappt das Problemlos.<br />
Ich bin irritiert .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363466</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 11:46:46 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 13:11:26 GMT]]></title><description><![CDATA[<p>Lymogry, wenn du Dir noch kein schlaues C++ Buch besorgt hast, wäre das jetzt eine prima Gelegenheit. Deine hier gestellten Fragen, lassen sich größtenteils beantworten, wenn man die Grundlagen (separate compilation, one definition rule) drauf hat.</p>
<p>Lymogry schrieb:</p>
<blockquote>
<p>Wenn ich jetzt zwei Klassen hätte und die andere Klasse B hätte Objekte von A (oder wäre eine Ableitung). Müssen diese Klassen in die selbe Datei oder in andere Headern?</p>
</blockquote>
<p>Müssen tun die gar nichts. Halte Dich einfach an die <em>one definition rule</em>.</p>
<p>Lymogry schrieb:</p>
<blockquote>
<p>Ich hab probeweise die erste Klasse ausgelagert, den Rest in der main.cpp gelassen. Der Compiler sagt, er würde die Klasse A nicht kennen. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Liegt es vielleicht an der Reihenfolge, in der er die linkt? Der Header ist aber überall eingebunden, eigentlich müsste main.cpp sagen &quot;brauche A, haben den Rest&quot; und header &quot;habe A, brauche nix&quot; ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
</blockquote>
<p>Wenn der Compiler sagt, dass er Klasse A nicht kenne, dann ist der Linker noch gar nicht zum Zug gekommen. Du wirst wohl irgendwo mindestens einen Fehler gemacht haben. Vielleicht hast du ja versehentlich 2mal denselben Include-Guard für zwei Header verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363494</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363494</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:11:26 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 13:29:58 GMT]]></title><description><![CDATA[<p>Ich hab gute Grundlagenbücher hier: Der C++ Programmierer, Primer, Stroustrup und Meyers.... (dann sieht man schonmal das Problem vor lauter Büchern nicht mehr)<br />
Und eigentlich kenne ich das mit dem Linken schon durch C und dachte, ich hätts schon verstanden, denn daa hatte ich nie Probleme mit dem Linker ...<br />
Ich dachte, dass mein Probleme nun durch die Klassen und deren Trennung daherrühren ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":/"
      alt="😕"
    /></p>
<blockquote>
<p>Vielleicht hast du ja versehentlich 2mal denselben Include-Guard für zwei Header verwendet.</p>
</blockquote>
<p>hmm .. aber dafür habe ich ja den Präprozessor<br />
#ifndef HEADER1_H<br />
#define HEADER1_H</p>
<p>muss ich da trotzdem aufpassen, dass ich die nicht den mehrfach nehme? Was ist mit den Stdbibliotheken?</p>
<p>In C hats noch nie gemeckert .... (mache ich grad was anderes ... ich weiß es nicht ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /> )</p>
<blockquote>
<p>Du wirst wohl irgendwo mindestens einen Fehler gemacht haben.</p>
</blockquote>
<p>*lach* ja, davon geh ich auch aus ... <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="😃"
    /><br />
Ich breche das nun alles in ein Minimalbeispiel, aber so scheine ich alles richtig zu machen ... hmm hmm ...<br />
Ich breche noch runter <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363503</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:29:58 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 13:44:56 GMT]]></title><description><![CDATA[<p>ajajaj ... ich habs gefunden ... der Fehler ist eigentlich schon zu peinlich, um genannt zu werden ... <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="😃"
    /> oh man ...:<br />
Weil ich erstmal die Trennung der Klassen nicht hinbekommen habe (siehe ersten Post) ich hab das Programm mit Minimalbeispiel in Header geteilt. Die Minimalbeispiele liefen dann, also zurück ins Programm kopiert. Programm lief nicht.... Nun. Eine Klasse aus dem falschen Minimalbeispiel in .cpp kopiert, aber ihre richtige Form .hpp kopiert. Der Unterschied war winzig ... Und schon meinte er, er kenne die Klassen und die Funktionen nicht mehr ....</p>
<p>sorry sorry .... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_down"
      title=":-1:"
      alt="👎"
    /></p>
<p>PS:</p>
<blockquote>
<p>(separate compilation, one definition rule</p>
</blockquote>
<p>ja, immer separat kompilieren lassen können! <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="🙂"
    /><br />
Keine doppelten Definitionen.<br />
Ist mir geläufig. Danke! <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>Ihr seid spitze! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363513</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363513</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 13:44:56 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 14:03:23 GMT]]></title><description><![CDATA[<p>ähm ... bei einer Sache konnte ich euch nicht ganz folgen:<br />
<strong>Wo soll der Output jetzt rein?</strong><br />
So wie es da steht, erzeugt es ein Problem: <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>main.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &quot;header1.hpp&quot;

std::ofstream Output(&quot;output.txt&quot;);

int main() {
    return 0;
}
</code></pre>
<p>header1.hpp</p>
<pre><code>#ifndef HEADER1_HPP
#define HEADER1_HPP

class Ort {
public:
    Ort(int einX=0, int einY=0);
    int getX() const;
    int getY() const;
    void verschieben(int x, int y);
    void anzeigen() const;
private:
    int xKoordinate;
    int yKoordinate;
};

#endif // HEADER1_HPP
</code></pre>
<p>header1.cpp</p>
<pre><code>#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &quot;header1.hpp&quot;

Ort::Ort(int einX, int einY) : xKoordinate(einX), yKoordinate(einY) {}
int Ort::getX() const {return xKoordinate;}
int Ort::getY() const {return yKoordinate;}
void Ort::verschieben(int x, int y) {xKoordinate=x; yKoordinate=y;}
void Ort::anzeigen() const {
        std::cout &lt;&lt; &quot;(&quot; &lt;&lt; getX() &lt;&lt; &quot;,&quot; &lt;&lt; getY() &lt;&lt; &quot;) &quot;;
        Output &lt;&lt; &quot;Hallo&quot;;  // Fehler: &quot;Output wurde in diesem Gueltigkeitsbereich nicht definiert!&quot;
  }
</code></pre>
<p>Merci <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363518</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:03:23 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 14:36:27 GMT]]></title><description><![CDATA[<p>Natürlich kennt der Output nicht. Woher denn?<br />
Wenn der Compiler Header1.cpp kompiliert, weiß der nicht, was in main.cpp steht und umgekehrt.<br />
Lösung: Als Parameter übergeben oder deklarieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363523</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:36:27 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 14:41:59 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Natürlich kennt der Output nicht. Woher denn?<br />
Wenn der Compiler Header1.cpp kompiliert, weiß der nicht, was in main.cpp steht und umgekehrt.</p>
</blockquote>
<p>schon klar.<br />
Ich dachte, globale Variablen sind jetzt auch klug und gehen mit <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="🙂"
    /> <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>
<blockquote>
<p>Lösung: Als Parameter übergeben oder deklarieren.</p>
</blockquote>
<p>Das mit der deklaration versuche ich....<br />
Einmal<br />
std::ofstream Output;<br />
in header.hpp<br />
Und<br />
Output.open(&quot;output.txt&quot;)<br />
in main.</p>
<p>Compiler sagt: Multiple Definition of Output ... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363525</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363525</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:41:59 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 14:44:49 GMT]]></title><description><![CDATA[<p>header1.hpp</p>
<pre><code>#ifndef HEADER1_HPP
#define HEADER1_HPP

#include &lt;ostream&gt;

class Ort {
public:
    Ort(int einX=0, int einY=0);
    int getX() const;
    int getY() const;
    void verschieben(int x, int y);
    void anzeigen(std::ostream&amp; wo) const; // &lt;-- z.B. hier
private:
    int xKoordinate;
    int yKoordinate;
};

#endif // HEADER1_HPP
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2363527</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363527</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:44:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 14:57:49 GMT]]></title><description><![CDATA[<p>Dann muss ich aber std::ostream&amp; wo in jeder Subroutine mitschleppen, nur weil ich irgendwo mal eine Ausgabe haben möchte?</p>
<p>Gibt es dazu eine Alternative? Kann ich irgendwie als Stdargument vielleicht &quot;output.txt&quot; hinschreiben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363531</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 14:57:49 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Tue, 29 Oct 2013 09:49:22 GMT]]></title><description><![CDATA[<p>Lymogry, globale Objekte sind sowieso (sehr oft) Käse.</p>
<p>Offensichtlich kennst du das, was an &quot;separate compilation&quot; dranhängt <em>doch</em> nicht. Deswegen hab ich's ja auch erwähnt oben. Wenn der Compiler xxx.cpp kompiliert, guckt der sich höchstens die Dateien an, die dort per #include eingebunden werden. Das wars. Und bevor du etwas verwenden kannst, muss der Compiler vorher irgendwo eine Deklaration gesehen haben.</p>
<p>Das, was du da im Header stehen hast, ist aber keine Deklaration. Es ist eine Definition. Du hast Output also 2mal definiert. Einmal in der Übersetzungseinheit main.cpp und einmal in header.cpp (wegen #include header.hpp). Aus der Definition kann man jetzt -- wenn unbedingt erwünscht -- eine Deklaration machen: Schreib <code>extern</code> davor.</p>
<p>Das steht sicher alles in deinen schlauen Büchern. Mussu nur mal lesen. Das spart Dir und uns Zeit. :p (wirklich! auch dir!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363539</guid><dc:creator><![CDATA[krümelkacker]]></dc:creator><pubDate>Tue, 29 Oct 2013 09:49:22 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 16:00:55 GMT]]></title><description><![CDATA[<p>ok, Krümelkacker ..<br />
es war etwas krytisch, aber ich hab dich verstanden:</p>
<p>Wenn ich den stream in main.cpp außerhalb von main() deklariere, innerhalb von main() öffne und in einer anderen Datei header.cpp mit extern nochmal deklariere, dann funktioniert es! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /></p>
<p>Ich weiß, dass globale Variablen kacke sind! Und dass deswegen der Linker nicht so recht funktioniert!<br />
Ich nutze keine einzige globale Variable, ausser diesem Filepointer!<br />
Weil:<br />
wenn es mehrer Funktionen sind, die wachsen, sich gegenseitig enthalten usw.<br />
Und irgendwann in einer dieser Subroutinen soll mal eine Dateiausgabe rein. Dann will ich das genauso unkompliziert haben, wie ein std:cout. Was soll ich also in JEDER Fkt meinen Filepointer mitschleppen?<br />
Dann hat eine globale Variable einen guten Sinn ....</p>
<p>Oder hast du eine elegantere Option?<br />
Ich bin durchaus belehrbar und wissbegierig! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363544</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Mon, 28 Oct 2013 16:00:55 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Mon, 28 Oct 2013 16:40:06 GMT]]></title><description><![CDATA[<p>Wenn du Logging haben willst (so hab ich das verstanden), nimmste std::clog.<br />
In der main() machste dann:<br />
std::clog.rdbuf(output.rdbuf());<br />
Und siehe da: Alles wird in output hineingeschrieben.<br />
Für andere Ausgaben, ist die beste Lösung den Stream zu übergeben. Das ist zwar umständlich, aber glaub mir: Es ist besser.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2363553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363553</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Mon, 28 Oct 2013 16:40:06 GMT</pubDate></item><item><title><![CDATA[Reply to Funktionen und Definition - Trennung in Headern on Tue, 29 Oct 2013 13:47:48 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>Wenn du Logging haben willst (so hab ich das verstanden), nimmste std::clog.<br />
In der main() machste dann:<br />
std::clog.rdbuf(output.rdbuf());<br />
Und siehe da: Alles wird in output hineingeschrieben.</p>
</blockquote>
<p>DANKE Nathen!<br />
Den Befehl kannte ich noch nicht. Das löst aber genau mein Problem!!!! MERCI! <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2363696</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2363696</guid><dc:creator><![CDATA[Lymogry]]></dc:creator><pubDate>Tue, 29 Oct 2013 13:47:48 GMT</pubDate></item></channel></rss>