<?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[Frage zu Header-Dateien]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin gerade dabei mich durch ein größereres Projekt durchzuwühlen und bin in C++ noch im Anfangsstadium. Dabei stoße ich das erste mal auf Header-Dateien in denen mehrere Klassen aufgelistet werden bevor der Header-Teil für die tatsächliche Klasse kommt.<br />
Könnt ihr mir kurz beschreiben, in welchen Fällen das notwendig ist ? Ich konnte in keiner Literatur was passendes finden.</p>
<pre><code>class ATANCamera;
class Map;
class MapMaker;
class Tracker;
class ARDriver;
class MapViewer;

class System
{
public:
  System();
  void Run();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/332492/frage-zu-header-dateien</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Apr 2026 20:41:18 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/332492.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 04 May 2015 15:00:42 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:00:42 GMT]]></title><description><![CDATA[<p>Hallo zusammen,<br />
ich bin gerade dabei mich durch ein größereres Projekt durchzuwühlen und bin in C++ noch im Anfangsstadium. Dabei stoße ich das erste mal auf Header-Dateien in denen mehrere Klassen aufgelistet werden bevor der Header-Teil für die tatsächliche Klasse kommt.<br />
Könnt ihr mir kurz beschreiben, in welchen Fällen das notwendig ist ? Ich konnte in keiner Literatur was passendes finden.</p>
<pre><code>class ATANCamera;
class Map;
class MapMaker;
class Tracker;
class ARDriver;
class MapViewer;

class System
{
public:
  System();
  void Run();
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2452458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452458</guid><dc:creator><![CDATA[sneuma12]]></dc:creator><pubDate>Mon, 04 May 2015 15:00:42 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:02:46 GMT]]></title><description><![CDATA[<p>Das sind Forwärtsdeklarationen.</p>
<p>Damit teilst du dem Compiler mit, dass es diese Klassen gibt, ohne dass du dafür den entspechenden Header einbinden musst. Das musst du dann erst in der cpp-Datei machen, wenn du die Klassen tatsächlich verwendest.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452459</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452459</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 04 May 2015 15:02:46 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:15:01 GMT]]></title><description><![CDATA[<p>Aber welchen Zweck erfüllt das ? Reicht es nicht aus die Header-Datei der jeweiligen Klasse in der cpp-Datei einzubinden ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452460</guid><dc:creator><![CDATA[sneuma12]]></dc:creator><pubDate>Mon, 04 May 2015 15:15:01 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:33:23 GMT]]></title><description><![CDATA[<p>sneuma12 schrieb:</p>
<blockquote>
<p>Reicht es nicht aus die Header-Datei der jeweiligen Klasse in der cpp-Datei einzubinden ?</p>
</blockquote>
<p>Wenn eine solche Klasse bspw. als Rückgabewert einer Methode deklarieren willst, reicht das nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452461</guid><dc:creator><![CDATA[daddy_felix]]></dc:creator><pubDate>Mon, 04 May 2015 15:33:23 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:41:33 GMT]]></title><description><![CDATA[<p>Du musst die Frage andersherum stellen: warum genügt es, nur die Vorwärtsdeklarationen zu verwenden und nicht die gesamte Klassendefinition (die in der Headerdatei steht)?</p>
<p>EDIT: falsch gelesen. Siehe Antwort von Daddy_felix. Meine Antwort gilt natürlich trotzdem.</p>
<p>Antwort: wenn es egal ist, wie die Klasse im Detail aussieht. Mit einer Vorwärtsdeklaration kannst du beispielsweise Zeiger auf diese Klasse verwenden:</p>
<pre><code>class foo;
foo* ptr;
</code></pre>
<p>In einer Klasse ergibt das natürlich mehr Sinn, da der Pointee in der .cpp definiert werden kann. Hier muss natürlich die gesamte Klasse bekannt sein.<br />
Ein Beispiel (schlechtes Design, don't try this at home):</p>
<pre><code>// foo.hpp
class foo
{
    foo();
};
</code></pre>
<pre><code>// foo.cpp
#include &quot;foo.hpp&quot;

foo::foo()
{
    // some code
}
</code></pre>
<pre><code>// bar.hpp
class foo;

class bar
{
    bar();
    foo* foo_ptr;
};
</code></pre>
<pre><code>// bar.cpp

#include &quot;bar.hpp&quot;
#include &quot;foo.hpp&quot;

bar::bar()
{
    foo_ptr = new foo;
}
</code></pre>
<p>Für Vollständigkeit: Warum ist das schlechtes Design? -&gt; Hier gibt es keinen Grund, foo nicht als direkten Member von bar zu verwenden. Hier muss man noch einen Destruktor, einen Copy-Constructor und Zuweisungsoperator schreiben. Unnötig.</p>
<pre><code>// bar.hpp

#include &quot;foo.hpp&quot;

class bar
{
    foo f;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2452464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452464</guid><dc:creator><![CDATA[Hyde++ 0]]></dc:creator><pubDate>Mon, 04 May 2015 15:41:33 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 15:48:52 GMT]]></title><description><![CDATA[<p>Dann mach doch gleich ein besseres Beispiel <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>
<pre><code>// bar.hpp
class foo;

class bar
{
    barFct(foo* foo_ptr);
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2452465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452465</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Mon, 04 May 2015 15:48:52 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 17:54:07 GMT]]></title><description><![CDATA[<p>Ja, stimmt. Wäre besser gewesen. Naja...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452475</guid><dc:creator><![CDATA[Hyde++ 0]]></dc:creator><pubDate>Mon, 04 May 2015 17:54:07 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 19:02:36 GMT]]></title><description><![CDATA[<p>Mal abgesehen von Designgründen: Wenn so ein Projekt mal größer wird, kann die Zeit, die fürs Kompilieren draufgeht schon ganz schön lang werden.<br />
Eine Möglichkeit, die Kompilierzeiten kurz zu halten, ist so wenige Header-Dateien wie möglich einzubinden. Wenn eine Klasse z.B. nur als einen Pointer verwende, reicht eine Vorwärtsdeklaration völlig aus, und ich spare mir den ganzen Header einzubinden - und vor allem rekursiv alle anderen Header die von diesem eingebunden werden.</p>
<p>Ich würde sogar empfehlen Vorwärtsdeklarationen zu bevorzugen und den Header erst dann einzubinden, wenn es erforderlich ist, dass die Klasse vollständig ausdefiniert ist (kann ziemlich nervig sein das bei einem größeren Projekt nachträglich zu machen).</p>
<p>Finnegan</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452487</guid><dc:creator><![CDATA[Finnegan]]></dc:creator><pubDate>Mon, 04 May 2015 19:02:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Mon, 04 May 2015 22:28:37 GMT]]></title><description><![CDATA[<p>Ja, Vorwärtsdeklarationen FTW!</p>
<p>Gerne auch über spezielle &quot;forward.hpp&quot; Headers die Vorwärtsdeklarationen für alles was in einem Projekt/Modul/Namespace definiert wird enthalten.<br />
<code>enum</code> s müssen dann halt ganz in diese &quot;forward.hpp&quot; Header verschoben werden. Das ist hässlich, stellt aber normalerweise kein echtes Problem dar.</p>
<p>Nur wenn man nested classes hat, und Zeiger/Referenzen auf diese ausserhalb der deklarierenden Klasse bräuchte, dann muss man halt weinen gehen <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>
<pre><code class="language-cpp">// Wäre fein, aber leider nein :(
class outer::inner;

// Und weil wir gerade dabei sind..., auch leider nein:
namespace foo::bar {
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2452509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452509</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Mon, 04 May 2015 22:28:37 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 01:00:54 GMT]]></title><description><![CDATA[<p>Dein 2tes 'leider' verstehe ich nicht. Was ist da foo und bar?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452518</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452518</guid><dc:creator><![CDATA[Jockelx]]></dc:creator><pubDate>Tue, 05 May 2015 01:00:54 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 01:55:14 GMT]]></title><description><![CDATA[<p>Na auch wieder &quot;outer&quot; und &quot;inner&quot;, nur halt Namespaces:</p>
<pre><code class="language-cpp">namespace foo {
namespace bar {
// Bäh! Viel schöner (UND praktischer) wäre:
namespace foo::bar {
</code></pre>
<p>Das hat jetzt mit Funktionalität nixe zu tun, aber es wäre angenehm.<br />
U.a. könnte man dann die automatische Einrückung von Namespace-Content sinnvoll in Kombination mit <code>Project::Module::SubModule</code> Namespace-Hierarchien nutzen.<br />
(Wer will schon den ganzen Content in allen <code>Project/Module/SubModule/*.cpp</code> Files 3-fach eingerückt haben, nur weil <code>SubModule</code> ein Namespace in einem Namespace in einem Namespace ist? Und wer will schon 3x <code>namespace</code> schreiben müssen dafür?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452521</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 05 May 2015 01:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 05:40:27 GMT]]></title><description><![CDATA[<p>IIRC gibt's da ein angenommenes Proposal für C+++17 für.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452531</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Tue, 05 May 2015 05:40:27 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 06:28:50 GMT]]></title><description><![CDATA[<p>Für beides oder nur für die Namespace-Sache?</p>
<p>ps: Sorry wegen OT <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>
]]></description><link>https://www.c-plusplus.net/forum/post/2452537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452537</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 05 May 2015 06:28:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 08:20:45 GMT]]></title><description><![CDATA[<p>Nathan schrieb:</p>
<blockquote>
<p>IIRC gibt's da ein angenommenes Proposal für C+++17 für.</p>
</blockquote>
<p>Es gibt ein <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1524.htm" rel="nofollow">Proposal von 2003</a> das abgelehnt wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452547</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 05 May 2015 08:20:45 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 09:22:20 GMT]]></title><description><![CDATA[<p>Gibt auch was aus 2014.<br />
<a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html" rel="nofollow">http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4230.html</a></p>
<p>Frage: wie bekommt man raus wie der Status von so einem Proposal ist?</p>
<p>EDIT: ARGH. OK. Auf <a href="http://en.wikipedia.org/wiki/C%2B%2B17" rel="nofollow">http://en.wikipedia.org/wiki/C%2B%2B17</a> ist es unter &quot;expected features&quot; gelistet <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="🙂"
    /> Aber wie findest man es allgemein raus, also ohne zufällig auf einer Seite wie Wikipedia etwas darüber zu finden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452553</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452553</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 05 May 2015 09:22:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Header-Dateien on Tue, 05 May 2015 11:32:24 GMT]]></title><description><![CDATA[<p>Schau dir die meeting minutes an</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2452566</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2452566</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Tue, 05 May 2015 11:32:24 GMT</pubDate></item></channel></rss>