<?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[Vorwärtsdeklaration]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein Problem mit der (meiner Meinung nach) bescheuerten Vorwärtsdeklaration des C++ Single-Pass-Compilers.<br />
Ich habe eine Anzahl an structs, die alle untereinander verwoben sind. Ich versuche es mal an einem Beispiel zu erklären:</p>
<pre><code class="language-cpp">//Body.h
#ifndef BODY_HEADER
#define BODY_HEADER

#include &quot;Contact.h&quot;

struct Body{
   bool isUnder(Contact &amp;c);
};
#endif
</code></pre>
<pre><code class="language-cpp">//Contact.h
#ifndef CONTACT_HEADER
#define CONTACT_HEADER

struct Contact{
   Body *axBodies[2];
};
#endif
</code></pre>
<p>Wenn ich jetzt in meinem Hauptprogramm die Datei &quot;Body.h&quot; lade (mit #include), dann gibt es in der Zeile &quot;Body *axBodies[2]&quot; den Fehler &quot;error C2061: Syntaxfehler: Bezeichner 'Body' &quot;.</p>
<p>Ich habe dann folgendes versucht:</p>
<pre><code class="language-cpp">//main.h
#include &lt;iostream&gt;
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

struct Body;
struct Contact;

#include &quot;Body.h&quot;
#include &quot;Contact.h&quot;
</code></pre>
<p>Und im Hauptprogramm dieses &quot;Main.h&quot; laden (ich habe die #include aus Body.h rausgenommen). Dann kriege ich in der Zeile &quot;bool isUnder(Contact &amp;c)&quot; die Fehlermeldung: &quot;error C2061: Syntaxfehler: Bezeichner 'Contact' &quot;.</p>
<p>Kann mir jemand helfen, wie ich dies richtig anordne oder aufbaue, damit der Compiler nicht auf die Barrikade geht und seine Arbeit macht?</p>
<p>Ich hoffe das Problem ist klar genug geschildert und lösbar.<br />
MfG,<br />
Darth</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/268156/vorwärtsdeklaration</link><generator>RSS for Node</generator><lastBuildDate>Tue, 01 Sep 2026 22:06:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/268156.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 05 Jun 2010 00:16:37 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 00:16:37 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe gerade ein Problem mit der (meiner Meinung nach) bescheuerten Vorwärtsdeklaration des C++ Single-Pass-Compilers.<br />
Ich habe eine Anzahl an structs, die alle untereinander verwoben sind. Ich versuche es mal an einem Beispiel zu erklären:</p>
<pre><code class="language-cpp">//Body.h
#ifndef BODY_HEADER
#define BODY_HEADER

#include &quot;Contact.h&quot;

struct Body{
   bool isUnder(Contact &amp;c);
};
#endif
</code></pre>
<pre><code class="language-cpp">//Contact.h
#ifndef CONTACT_HEADER
#define CONTACT_HEADER

struct Contact{
   Body *axBodies[2];
};
#endif
</code></pre>
<p>Wenn ich jetzt in meinem Hauptprogramm die Datei &quot;Body.h&quot; lade (mit #include), dann gibt es in der Zeile &quot;Body *axBodies[2]&quot; den Fehler &quot;error C2061: Syntaxfehler: Bezeichner 'Body' &quot;.</p>
<p>Ich habe dann folgendes versucht:</p>
<pre><code class="language-cpp">//main.h
#include &lt;iostream&gt;
#include &lt;math.h&gt;
#include &lt;stdlib.h&gt;

using namespace std;

struct Body;
struct Contact;

#include &quot;Body.h&quot;
#include &quot;Contact.h&quot;
</code></pre>
<p>Und im Hauptprogramm dieses &quot;Main.h&quot; laden (ich habe die #include aus Body.h rausgenommen). Dann kriege ich in der Zeile &quot;bool isUnder(Contact &amp;c)&quot; die Fehlermeldung: &quot;error C2061: Syntaxfehler: Bezeichner 'Contact' &quot;.</p>
<p>Kann mir jemand helfen, wie ich dies richtig anordne oder aufbaue, damit der Compiler nicht auf die Barrikade geht und seine Arbeit macht?</p>
<p>Ich hoffe das Problem ist klar genug geschildert und lösbar.<br />
MfG,<br />
Darth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907072</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907072</guid><dc:creator><![CDATA[Darth]]></dc:creator><pubDate>Sat, 05 Jun 2010 00:16:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 00:29:53 GMT]]></title><description><![CDATA[<p>Die beiden Header müssen sich nicht &quot;inkludieren&quot;:</p>
<pre><code class="language-cpp">//Body.h
#ifndef BODY_HEADER
#define BODY_HEADER

// Forward-Deklaration von Contact
struct Contact;

struct Body{
   bool isUnder(Contact &amp;c);
};
#endif
</code></pre>
<pre><code class="language-cpp">//Contact.h
#ifndef CONTACT_HEADER
#define CONTACT_HEADER

// Forward-Deklaration von Body
struct Boy;

struct Contact{
   Body *axBodies[2];
};
#endif
</code></pre>
<p>Und hier hast du richtig Murks gebaut:</p>
<ul>
<li>Verwende <code>cmath</code> und <code>cstdlib</code> statt der C-Headers - Die sind kein Standard!</li>
<li><code>using namespace std;</code> in einem Header? - NIEMALS!!!!</li>
</ul>
<pre><code class="language-cpp">//main.h
#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;

#include &quot;Body.h&quot;
#include &quot;Contact.h&quot;
</code></pre>
<p>Ich habs jetzt nicht ausprobiert, aber so sollte es funktionieren...<br />
Viel Glück</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907075</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907075</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sat, 05 Jun 2010 00:29:53 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 00:33:29 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;
#include &quot;Body.h&quot;
#include &quot;Contact.h&quot;
</code></pre>
<p>gehört auch nicht in den Header.<br />
Nur Dinge inkludieren, die unbedingt für den Header notwendig sind!<br />
Hier kann der Header also leer bleiben, bzw. ist überflüssig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907076</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907076</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 05 Jun 2010 00:33:29 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 09:19:59 GMT]]></title><description><![CDATA[<p>Hallo daersc,</p>
<p>deinen Ansatz habe ich auch schon versucht. Aber da gibt mir der Compiler den Fehler aus, dass ich das &quot;undefinierte struct Contact&quot; (bzw Body) verwende. Er KENNT zwar den struct, aber der ist ja noch &quot;leer&quot; dort.</p>
<p>Das iostream etc hab ich aus dem Header genommen, danke für den Tipp.</p>
<p>MfG,<br />
Darth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907157</guid><dc:creator><![CDATA[Darth]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:19:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 09:25:18 GMT]]></title><description><![CDATA[<p>Darth schrieb:</p>
<blockquote>
<p>Aber da gibt mir der Compiler den Fehler aus, dass ich das &quot;undefinierte struct Contact&quot; (bzw Body) verwende. Er KENNT zwar den struct, aber der ist ja noch &quot;leer&quot; dort.</p>
</blockquote>
<p>Dann hast du nicht den ganzen Code gepostet.<br />
Auf Klassenelemente kannst du natürlich erst dann zugreifen, wenn die gesamte Klassenstruktur bekannt ist. Das ist erst in der .cpp-Datei der Fall.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907159</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:25:18 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 09:47:59 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>Auf Klassenelemente kannst du natürlich erst dann zugreifen, wenn die gesamte Klassenstruktur bekannt ist. Das ist erst in der .cpp-Datei der Fall.</p>
</blockquote>
<p>Was meinst du damit?</p>
<p><strong><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/24785">@Darth</a></strong><br />
Du brauchst im Header <em>Contact</em> die Vorwärtsdeklaration von <em>Body</em>. Allerdings kannst du damit nur Zeiger halten. Sobald du irgendwie dereferenzieren willst, ist es mit dem Ansatz aus. Mit dem Array axBodies hälst du bisher auch nur Zeiger, daher gibt es mit dem geposteten Code an der Stelle noch keine Probleme.</p>
<p>Der Header <em>Body</em> muss den Header <em>Contact</em> inkludieren, weil du dort nicht nur mit Zeigern auf Contact arbeitest, somit müssen die gesamten Objekteigenschaften von Contact bekannt sein.</p>
<pre><code class="language-cpp">//Contact.h
#ifndef CONTACT_HEADER
#define CONTACT_HEADER

// Forward-Deklaration von Body
struct Body;

struct Contact{
   Body *axBodies[2];
};
#endif
</code></pre>
<pre><code class="language-cpp">//Body.h
#ifndef BODY_HEADER
#define BODY_HEADER

#include &quot;Contact.h&quot;

struct Body{
   bool isUnder(Contact &amp;c);
};
#endif
</code></pre>
<pre><code class="language-cpp">//main.h
#include &lt;iostream&gt;
#include &lt;cmath&gt;
#include &lt;cstdlib&gt;

#include &quot;Body.h&quot;
#include &quot;Contact.h&quot;	

using namespace std;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1907169</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907169</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Sat, 05 Jun 2010 09:47:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 10:02:07 GMT]]></title><description><![CDATA[<p>hmpf schrieb:</p>
<blockquote>
<p>Athar schrieb:</p>
<blockquote>
<p>Auf Klassenelemente kannst du natürlich erst dann zugreifen, wenn die gesamte Klassenstruktur bekannt ist. Das ist erst in der .cpp-Datei der Fall.</p>
</blockquote>
<p>Was meinst du damit?</p>
</blockquote>
<p>In Contact.cpp und Body.cpp sind jeweils beide Header eingebunden, also kann man auch auf Member der jeweils anderen Klasse zugreifen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907179</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907179</guid><dc:creator><![CDATA[Athar]]></dc:creator><pubDate>Sat, 05 Jun 2010 10:02:07 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 10:12:44 GMT]]></title><description><![CDATA[<p>Athar schrieb:</p>
<blockquote>
<p>In Contact.cpp und Body.cpp sind jeweils beide Header eingebunden, also kann man auch auf Member der jeweils anderen Klasse zugreifen.</p>
</blockquote>
<p>Weiß zwar noch immer nicht, worauf du hinaus willst, aber ich muss ja nicht alles verstehen. <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/1907189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907189</guid><dc:creator><![CDATA[hmpf]]></dc:creator><pubDate>Sat, 05 Jun 2010 10:12:44 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 21:09:12 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke für die Hilfe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/23889">@Athar</a>,<br />
ja, ich habe nicht den ganzen Code gepostet. Das wären etwa um die 1500 Zeilen, ich habe es auf das wesentliche gekürzt, möglich dass ich dabei etwas wichtiges vergessen habe.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28805">@hmpf</a>,<br />
dass ich nur Zeiger verwenden darf wusste ich nicht, es stimmt dass ich da mit Referenzen arbeite (und auch andernorts). Auf Membervariabeln greife ich eigentlich nirgends zu, weil ich im h-File nur die Funktionsdeklarationen aber keine Rümpfe habe.</p>
<p>So, nun da mir das erklärt wurde, kann ich versuchen das richtig zu basteln <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="🙂"
    /> Ich danke nochmal für die Hilfe.</p>
<p>Mit freundlichen Grüssen,<br />
Darth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907488</guid><dc:creator><![CDATA[Darth]]></dc:creator><pubDate>Sat, 05 Jun 2010 21:09:12 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sat, 05 Jun 2010 21:23:21 GMT]]></title><description><![CDATA[<p>Darth schrieb:</p>
<blockquote>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/28805">@hmpf</a>,<br />
dass ich nur Zeiger verwenden darf wusste ich nicht, es stimmt dass ich da mit Referenzen arbeite (und auch andernorts). Auf Membervariabeln greife ich eigentlich nirgends zu, weil ich im h-File nur die Funktionsdeklarationen aber keine Rümpfe habe.</p>
</blockquote>
<p>Referenzen und Zeiger verhalten sich gleich, was die Abhängigkeiten betrifft. Du benötigst die Definition des Typen erst bei der Dereferenzierung.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907498</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907498</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sat, 05 Jun 2010 21:23:21 GMT</pubDate></item><item><title><![CDATA[Reply to Vorwärtsdeklaration on Sun, 06 Jun 2010 16:12:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ach Mensch.. kaum hat man das Gefühl, man habe das Zeug verstanden kommt der Nächste und verwirrt einen wieder. Danke dafür Nexus <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>Dennoch scheint es zu funktionieren, wenn ich von &quot;under(Contact &amp;c)&quot; zu &quot;under(Contact *c)&quot; wechsle <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="😕"
    /> Da ich im Moment keinen grossen Unterschied zwischen Pointer und Referenzen sehe, ist es mir eigentlich relativ egal welche Variante ich verwende.</p>
<p>So.. Thx <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>MfG,<br />
Darth</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1907845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1907845</guid><dc:creator><![CDATA[Darth]]></dc:creator><pubDate>Sun, 06 Jun 2010 16:12:08 GMT</pubDate></item></channel></rss>