<?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[Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich arbeite seit kurzer Zeit wieder mit C++. Mein Ziel ist es, dass 2 Klassen auf einander zugreifen können und auch ihre Methoden usw benutzen können.<br />
Dateien :<br />
A.h:</p>
<pre><code>#pragma once // Include-Guard
#include &quot;B.h&quot;
class A
{
public:
	B b;
	A(void);
	~A(void);
};
</code></pre>
<p>A.cpp</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;A.h&quot;

A::A(void)
{
}

A::~A(void)
{
}
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
#include &quot;A.h&quot;
class B
{
public:
	B(void);
	~B(void);
	void greet();
};
</code></pre>
<p>B.cpp</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;B.h&quot;
using namespace std;

B::B(void)
{
}

B::~B(void)
{
}

void B::greet(){
	cout &lt;&lt; &quot;B says hello&quot;;
}
</code></pre>
<p>Example.cpp</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;A.h&quot;
#include &lt;string&gt;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	A a;
	a.b.greet();
	string v;
	cin &gt;&gt; v;
	return 0;
}
</code></pre>
<p>Wie man deutlich sehen kann, verusuchen die Klassen A und B auf einander zu zugreifen und um das möglich zu machen müssen sie sich gegenseitig includieren. Es sollte eigentlich alles funktionieren, da #pragma once als Include-Guard dient. Wenn ich nun versuche in der A.h ein Objekt von B zu erstellen mekert der Compiler :</p>
<pre><code>1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'b'
1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
</code></pre>
<p>Wenn ich es aber so drehe, dass Klasse A und B sich nicht gegenseitig brauchen, dann funktioniert alles wunderbar. Also : Wie löse ich das Problem? Ich hoffe man kann mir helfen <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>Mit freundlichen Grüßen,</p>
<p>Jona</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/330730/problem-mit-quot-zirkuläre-abhängigkeit-quot-objekte-können-nicht-im-header-erstellt-werden</link><generator>RSS for Node</generator><lastBuildDate>Thu, 02 Jul 2026 22:50:27 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/330730.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 23 Jan 2015 23:57:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Fri, 23 Jan 2015 23:57:24 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich arbeite seit kurzer Zeit wieder mit C++. Mein Ziel ist es, dass 2 Klassen auf einander zugreifen können und auch ihre Methoden usw benutzen können.<br />
Dateien :<br />
A.h:</p>
<pre><code>#pragma once // Include-Guard
#include &quot;B.h&quot;
class A
{
public:
	B b;
	A(void);
	~A(void);
};
</code></pre>
<p>A.cpp</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;A.h&quot;

A::A(void)
{
}

A::~A(void)
{
}
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
#include &quot;A.h&quot;
class B
{
public:
	B(void);
	~B(void);
	void greet();
};
</code></pre>
<p>B.cpp</p>
<pre><code>#include &quot;StdAfx.h&quot;
#include &quot;B.h&quot;
using namespace std;

B::B(void)
{
}

B::~B(void)
{
}

void B::greet(){
	cout &lt;&lt; &quot;B says hello&quot;;
}
</code></pre>
<p>Example.cpp</p>
<pre><code>#include &quot;stdafx.h&quot;
#include &quot;A.h&quot;
#include &lt;string&gt;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
	A a;
	a.b.greet();
	string v;
	cin &gt;&gt; v;
	return 0;
}
</code></pre>
<p>Wie man deutlich sehen kann, verusuchen die Klassen A und B auf einander zu zugreifen und um das möglich zu machen müssen sie sich gegenseitig includieren. Es sollte eigentlich alles funktionieren, da #pragma once als Include-Guard dient. Wenn ich nun versuche in der A.h ein Objekt von B zu erstellen mekert der Compiler :</p>
<pre><code>1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'b'
1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
1&gt;d:\jona\dokumente\visual studio 2010\projects\example\example\a.h(6): error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
</code></pre>
<p>Wenn ich es aber so drehe, dass Klasse A und B sich nicht gegenseitig brauchen, dann funktioniert alles wunderbar. Also : Wie löse ich das Problem? Ich hoffe man kann mir helfen <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>Mit freundlichen Grüßen,</p>
<p>Jona</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439308</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439308</guid><dc:creator><![CDATA[Jona192]]></dc:creator><pubDate>Fri, 23 Jan 2015 23:57:24 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 00:07:17 GMT]]></title><description><![CDATA[<pre><code>#pragma once // Include-Guard
#include &quot;B.h&quot;
class A
{
public:
	B b;//ok, A braucht b! Das include ist nötig. 
	A(void);
	~A(void);
};
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
#include &quot;A.h&quot;//wozu??? das ist un-sparsames ruminkludieren. erst die B.cpp 
//inludiert B.h und A.h
class B
{
public:
	B(void);
	~B(void);
	void greet();
};
</code></pre>
<p>Nur wer unsparsam ruminkludiert, kann C++ nicht auf einem Laptop benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439309</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Jan 2015 00:07:17 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 00:10:42 GMT]]></title><description><![CDATA[<p>Jona192 schrieb:</p>
<blockquote>
<p>Wie man deutlich sehen kann, verusuchen die Klassen A und B auf einander zu zugreifen und um das möglich zu machen müssen sie sich gegenseitig includieren.</p>
</blockquote>
<p>Nein, das sehe ich überhaupt nicht. B macht doch gar nichts mit A, außer dass in b.h sinnlos a.h inkludiert wird, was zu einer zirkularen Abhängigkeit führt. Selbst wenn in der b.cpp vielleicht irgendwann mal ein A-Objekt auftaucht, dann reicht es auch, wenn dort a.h eingebunden wird, anstatt in b.h. Falls in b.h eine Referenz oder Zeiger auf a.h benötigt wird, dann reicht auch eine Forward-declaration der Klasse A.</p>
<blockquote>
<p>Es sollte eigentlich alles funktionieren, da #pragma once als Include-Guard dient.</p>
</blockquote>
<p>Includeguards schützen nicht vor echten Fehlern, wie in diesem Fall einer zyklischen Abhängigkeit.</p>
<p>Noch ein paar Bemerkungen:<br />
-void als Argument: Sind wir hier in C?<br />
-Leerer Konstruktor/Destruktor: Da hat dir wohl irgendein stümperhaftes Lehrbuch beigebracht, dass man immer einen Konstruktor/Destruktor bräuchte. <a href="http://en.wikipedia.org/wiki/Special_member_functions" rel="nofollow">Unsinn</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439310</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439310</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Sat, 24 Jan 2015 00:10:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 13:19:16 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code>#pragma once // Include-Guard
#include &quot;B.h&quot;
class A
{
public:
	B b;//ok, A braucht b! Das include ist nötig. 
	A(void);
	~A(void);
};
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
#include &quot;A.h&quot;//wozu??? das ist un-sparsames ruminkludieren. erst die B.cpp 
//inludiert B.h und A.h
class B
{
public:
	B(void);
	~B(void);
	void greet();
};
</code></pre>
<p>Nur wer unsparsam ruminkludiert, kann C++ nicht auf einem Laptop benutzen.</p>
</blockquote>
<p>Ja das ist mir auch aufgefallen.. Das sind nur beispiel Klassen. Stell dir einfach vor beide brauchen sich.. Wie realisiere ich das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439362</guid><dc:creator><![CDATA[Jona192]]></dc:creator><pubDate>Sat, 24 Jan 2015 13:19:16 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 13:24:56 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nein, das sehe ich überhaupt nicht. B macht doch gar nichts mit A, außer dass in b.h sinnlos a.h inkludiert wird, was zu einer zirkularen Abhängigkeit führt. Selbst wenn in der b.cpp vielleicht irgendwann mal ein A-Objekt auftaucht, dann reicht es auch, wenn dort a.h eingebunden wird, anstatt in b.h. Falls in b.h eine Referenz oder Zeiger auf a.h benötigt wird, dann reicht auch eine Forward-declaration der Klasse A.</p>
</blockquote>
<p>Ja mein Fehler. Das sind nur Beispiel-Klassen. Ich frage mich jetzt, wie ich eine Forward-declaration anstelle?</p>
<p>[qoute=&quot;SeppJ&quot;]<br />
Noch ein paar Bemerkungen:<br />
-void als Argument: Sind wir hier in C?<br />
-Leerer Konstruktor/Destruktor: Da hat dir wohl irgendein stümperhaftes Lehrbuch beigebracht, dass man immer einen Konstruktor/Destruktor bräuchte. Unsinn.<br />
[/qoute]</p>
<p>Was sollte ich statt void nehmen? Ich brauche in diese Funktion ja kein Return.<br />
Und zu den Konstruktor/Dekonstruktor musst du dich bei Visual Studio beschweren. Trotzdem erstmal danke. Schadet es wenn ich konstruktoren habe, die ich nicht benutze?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439363</guid><dc:creator><![CDATA[Jona192]]></dc:creator><pubDate>Sat, 24 Jan 2015 13:24:56 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 13:43:51 GMT]]></title><description><![CDATA[<pre><code>#pragma once // Include-Guard

#include &quot;B.h&quot;//Ja, ist nötig. 

class A
{
public:
	B b;//ok, A braucht b für size-Bestimmung natürlich! Das include ist nötig. 
	A(){
		b-&gt;foo();//auch dafür, aber man könntes ja auch in die A.cpp 
//verschiebten. 
        }
};
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
//#include &quot;A.h&quot;//geht nicht! Zyklisch. 

class A;
//Liebes Visual Studio, 
//bitte weine nicht, wenn Du eine Verwendung von A als Klasse siehst, 
//obwohl Dir die ganzen Details von A noch nicht bekannt sind. 
//Ich verspreche Dir, daß ich Die bald alles verrate. 
//Beste Grüße, Volkard. 

class B
{
	A* pa;//8 Bytes, wie jeder Zeiger (64-bittig gedacht). Geht. 
public:
	A bar();//klappt sogar angeblich auch, hab ich aber nie verwendet. 
        void baz(A a);//dito
};

//Und die folgende Zeile habe ich in meinem unterirdischen Labor ertüftelt. 

//Volkards spätes include. 
#include &quot;A.h&quot;
//Dadurch ist die B wieder selfcontained.
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2439365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439365</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Jan 2015 13:43:51 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sat, 24 Jan 2015 13:41:37 GMT]]></title><description><![CDATA[<p>Jona192 schrieb:</p>
<blockquote>
<p>Was sollte ich statt void nehmen? Ich brauche in diese Funktion ja kein Return.</p>
</blockquote>
<p>void f(void)<br />
wird zu<br />
void f()</p>
<p>Jona192 schrieb:</p>
<blockquote>
<p>Und zu den Konstruktor/Dekonstruktor musst du dich bei Visual Studio beschweren. Trotzdem erstmal danke.</p>
</blockquote>
<p>Liebes Visual Studio,<br />
bitte ärgere Jona192 nicht mehr so viel.<br />
Beste Grüße, Volkard</p>
<p>Jona192 schrieb:</p>
<blockquote>
<p>Schadet es wenn ich konstruktoren habe, die ich nicht benutze?</p>
</blockquote>
<p>Ja, SeppJs Gemütsverfassung ändert sich, weils in seinen Augen so brennt. Sonst kein Schaden. Der Compiler erstellt sogar selber leere Konstruktoren, wenn Du es nicht machst. Aber seine sind inline (also innerhalb der Klasse definiert, wie meiner), dadurch kann selbst der dümmste Compiler den dann wieder wegoptimieren. Außerdem gehört es sich, kleine Trivialfunktionen im Header zu definieren, wenn die Definition zu lesen viel viel einfacher ist, als dazugehörige Kommentare/Dokumentation zu finden und zu lesen, die die Funktion umschreiben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439368</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439368</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 24 Jan 2015 13:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sun, 25 Jan 2015 14:35:48 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<pre><code>#pragma once // Include-Guard

#include &quot;B.h&quot;//Ja, ist nötig. 

class A
{
public:
	B b;//ok, A braucht b für size-Bestimmung natürlich! Das include ist nötig. 
	A(){
		b-&gt;foo();//auch dafür, aber man könntes ja auch in die A.cpp 
//verschiebten. 
        }
};
</code></pre>
<p>B.h</p>
<pre><code>#pragma once
//#include &quot;A.h&quot;//geht nicht! Zyklisch. 

class A;
//Liebes Visual Studio, 
//bitte weine nicht, wenn Du eine Verwendung von A als Klasse siehst, 
//obwohl Dir die ganzen Details von A noch nicht bekannt sind. 
//Ich verspreche Dir, daß ich Die bald alles verrate. 
//Beste Grüße, Volkard. 

class B
{
	A* pa;//8 Bytes, wie jeder Zeiger (64-bittig gedacht). Geht. 
public:
	A bar();//klappt sogar angeblich auch, hab ich aber nie verwendet. 
        void baz(A a);//dito
};

//Und die folgende Zeile habe ich in meinem unterirdischen Labor ertüftelt. 

//Volkards spätes include. 
#include &quot;A.h&quot;
//Dadurch ist die B wieder selfcontained.
</code></pre>
</blockquote>
<p>Hallo Volkard.</p>
<p>Erstmal Wow. Sehr sehr sehr vielen Dank, für diese sehr amüsante und unterhaltende erklärung. Ich musste echt des öfteren schmunzeln :D. Ich gehe jetzt mal davon aus, dass zeilen,wie</p>
<pre><code>A(){
		b-&gt;foo();//auch dafür, aber man könntes ja auch in die A.cpp 
//verschiebten. 
        }
</code></pre>
<pre><code>A* pa;//8 Bytes, wie jeder Zeiger (64-bittig gedacht). Geht.
</code></pre>
<pre><code>A bar();
</code></pre>
<pre><code>void baz(A a);//dito
</code></pre>
<p>nicht relevant sind, da es bei mir auch ohne diese Zeilen funktioniert hat. ich würde trotzdem gerne mal wissen, wozu eine Funktion wie foo() gedacht ist, da ich sie in mehreren code beispielen gesehen habe. Ich habe nur etwas von eine Platzhalter funktion gelesen. Außerdem würde ich auch noch gerne wissen, weshalb es dann funktioniert wenn ich das include von a.h gaaanz unten hin setzte, statt ganz an den anfang. Ich gehe davon aus, dass es die forward declaration stört, richtig?. Trotzdem sehr, sehr vielen Dank für deine Hilfe. Sehr Unterhaltend <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="👍"
    /> <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>Mit freundlichen Grüßen,</p>
<p>Jona</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439625</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439625</guid><dc:creator><![CDATA[Jona192]]></dc:creator><pubDate>Sun, 25 Jan 2015 14:35:48 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sun, 25 Jan 2015 14:39:10 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Jona192 schrieb:</p>
<blockquote>
<p>Was sollte ich statt void nehmen? Ich brauche in diese Funktion ja kein Return.</p>
</blockquote>
<p>void f(void)<br />
wird zu<br />
void f()</p>
</blockquote>
<p>Gut da darf ich mich mal wieder die Schuld VS zuschieben. Ich dachte es wäre auf void greet(); bezogen.</p>
<p>volkard schrieb:</p>
<blockquote>
<p>Jona192 schrieb:</p>
<blockquote>
<p>Schadet es wenn ich konstruktoren habe, die ich nicht benutze?</p>
</blockquote>
<p>Ja, SeppJs Gemütsverfassung ändert sich, weils in seinen Augen so brennt. Sonst kein Schaden. Der Compiler erstellt sogar selber leere Konstruktoren, wenn Du es nicht machst. Aber seine sind inline (also innerhalb der Klasse definiert, wie meiner), dadurch kann selbst der dümmste Compiler den dann wieder wegoptimieren. Außerdem gehört es sich, kleine Trivialfunktionen im Header zu definieren, wenn die Definition zu lesen viel viel einfacher ist, als dazugehörige Kommentare/Dokumentation zu finden und zu lesen, die die Funktion umschreiben.</p>
</blockquote>
<p>Gut gut war ja auch nur eine Beispiel Klasse <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="😉"
    /> Werde ich mir mal für die Zukunft merken. Es gehört sich ja einen sauberen style zu haben.</p>
<p>Gruß,</p>
<p>Jona</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439626</guid><dc:creator><![CDATA[Jona192]]></dc:creator><pubDate>Sun, 25 Jan 2015 14:39:10 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit &amp;quot;Zirkuläre Abhängigkeit&amp;quot; Objekte können nicht im header erstellt werden on Sun, 25 Jan 2015 16:42:48 GMT]]></title><description><![CDATA[<p>Jona192 schrieb:</p>
<blockquote>
<p>ich würde trotzdem gerne mal wissen, wozu eine Funktion wie foo() gedacht ist, da ich sie in mehreren code beispielen gesehen habe. Ich habe nur etwas von eine Platzhalter funktion gelesen.</p>
</blockquote>
<p>Jo. Es ist egal, wie die Funktion heißt oder was sie macht. Mir ging es nur darum, daß eine Forward-Deklariation dem Compiler nicht genug Detals erzählt, daß er Methoden von B schon kennen würde unbd aufrufen könnte.</p>
<pre><code>b-&gt;foo();//auch dafür, aber man könntes ja auch in die A.cpp
//verschiebten.
</code></pre>
<pre><code>b-&gt;f();//auch dafür, aber man könntes ja auch in die A.cpp
//verschiebten.
</code></pre>
<pre><code>b-&gt;dingsda();//auch dafür, aber man könntes ja auch in die A.cpp
//verschiebten.
</code></pre>
<pre><code>b-&gt;irgendeineFunktion();//auch dafür, aber man könntes ja auch in die A.cpp
//verschiebten.
</code></pre>
<p>Siehe auch <a href="http://de.wikipedia.org/wiki/Metasyntaktische_Variable" rel="nofollow">http://de.wikipedia.org/wiki/Metasyntaktische_Variable</a></p>
<p>Jona192 schrieb:</p>
<blockquote>
<p>Außerdem würde ich auch noch gerne wissen, weshalb es dann funktioniert wenn ich das include von a.h gaaanz unten hin setzte, statt ganz an den anfang.</p>
</blockquote>
<p>Die meisten lassen es sogar im Header ganz weg! In der B.cpp müdden dann eben B.hpp UND A.hpp inkludiert werden.</p>
<p>Man darf es auch unten hinschreiben mit dem Zweck, daß man in der B.cpp nur noch die B.hpp zu inkludieren braucht und die A.hpp nicht mehr. Hauptsache, es steht nicht oben, denn oben würden sich die beiden Klassen zyklisch gegenseitig brauchen. So braucht die B nur einen Schatten von A, der gerade mal reicht, damit man Zeiger auf A und Funktionsargumente und Funktionsrückgaben per A machen kann und sonst nix. Sobald man mehr machen will wie ein echtes A anlegen oder von einem a eine Funktion aufrufen oder Attribute anschauen, dann ist der Schatten nicht genug (und dann gehts eben einfach nicht).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2439653</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2439653</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 25 Jan 2015 16:42:48 GMT</pubDate></item></channel></rss>