<?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 Klassen [gelöst]]]></title><description><![CDATA[<p>Hi,<br />
Ich habe zwei Klassen (A und B). Beide benötigen sich gegenseitig.</p>
<pre><code class="language-cpp">A a, a1, a2;
B b, b1, b2;

a = b1 + b2;
b = a1 + a2;
</code></pre>
<p>Nur wenn ich die Operatoren so überlade, sagt der Compiler, dass die Klasse undefiniert ist...</p>
<pre><code class="language-cpp">//A.h

#ifndef _A
#define _A

#include &quot;B.h&quot;

class A
{
    public:
        A();
        A operator+(const A&amp; other)
        {
            //...
        }

        A operator=(const B&amp; other)
        {
            //...
        }
};

#endif

//B.h

#ifndef _B
#define _B

#include &quot;A.h&quot;

class B
{
    public:
        B();
        B operator+(const B&amp; other)
        {
            //...
        }

        B operator=(const A&amp; other)
        {
            //...
        }
};

#endif
</code></pre>
<p>Wie kann ich das Problem lösen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/261435/frage-zu-klassen-gelöst</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 07:28:13 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/261435.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 18 Feb 2010 14:19:22 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 17:14:24 GMT]]></title><description><![CDATA[<p>Hi,<br />
Ich habe zwei Klassen (A und B). Beide benötigen sich gegenseitig.</p>
<pre><code class="language-cpp">A a, a1, a2;
B b, b1, b2;

a = b1 + b2;
b = a1 + a2;
</code></pre>
<p>Nur wenn ich die Operatoren so überlade, sagt der Compiler, dass die Klasse undefiniert ist...</p>
<pre><code class="language-cpp">//A.h

#ifndef _A
#define _A

#include &quot;B.h&quot;

class A
{
    public:
        A();
        A operator+(const A&amp; other)
        {
            //...
        }

        A operator=(const B&amp; other)
        {
            //...
        }
};

#endif

//B.h

#ifndef _B
#define _B

#include &quot;A.h&quot;

class B
{
    public:
        B();
        B operator+(const B&amp; other)
        {
            //...
        }

        B operator=(const A&amp; other)
        {
            //...
        }
};

#endif
</code></pre>
<p>Wie kann ich das Problem lösen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857589</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857589</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 17:14:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 14:27:06 GMT]]></title><description><![CDATA[<p>Das Ergebnis von b1 + b2 ist natürlich wieder vom Typ B und nicht vom Typ A. Du bräuchtest also noch zusätzlich Konvertierungsoperatoren A-&gt;B und B-&gt;A.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857599</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857599</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 18 Feb 2010 14:27:06 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 14:54:48 GMT]]></title><description><![CDATA[<p>Deshalb</p>
<pre><code class="language-cpp">A operator=(const B&amp; other)
        {
            //...
        }
</code></pre>
<p>und</p>
<pre><code class="language-cpp">B operator=(const A&amp; other)
        {
            //...
        }
</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>
]]></description><link>https://www.c-plusplus.net/forum/post/1857622</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857622</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 14:54:48 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 14:56:40 GMT]]></title><description><![CDATA[<p>Zyklische Includes. Böse ganz böse.<br />
Lies das durch:<br />
<a href="http://www.drakon.ch/?id=&amp;offset=2&amp;mobile=0&amp;show_entry=77" rel="nofollow">http://www.drakon.ch/?id=&amp;offset=2&amp;mobile=0&amp;show_entry=77</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857627</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857627</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 18 Feb 2010 14:56:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:03:21 GMT]]></title><description><![CDATA[<p>Aber das müsste ich doch mit &quot;#ifndef&quot; und &quot;#define&quot; umgehen...</p>
<p>Ich brauche halt &quot;A=A+B&quot; und &quot;B=A+B&quot;<br />
Also ein Operator+ der aus A und B B oder A macht <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>
<p>Ich hatte auch &quot;class B;&quot; schon, aber es heißt wieder, dass B undefiniert ist.</p>
<p>Das Problem habe ich mit dem vorherigen Code:</p>
<pre><code>error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
</code></pre>
<p>Das Problem mit &quot;class B;&quot;:</p>
<pre><code>error C2027: Verwendung des undefinierten Typs &quot;B&quot;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1857630</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857630</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:03:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:03:50 GMT]]></title><description><![CDATA[<p>Sorry, hab den Code nicht ganz gelesen.</p>
<p>Du musst die Implementierungen der Funktionen in die cpp-Dateien auslagern. Dann klappts auch mit der forward declaration.</p>
<p>Das Problem umgehst du übrigens nicht mit #ifndef etc. Geh die Textersetzung (die ein #include nunmal ist) mal ganz explizit durch.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857633</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857633</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:03:50 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:04:26 GMT]]></title><description><![CDATA[<p>Nein. Damit verhinderst du nur, dass er die Klasse lesen kann. Gehs einfach mal von Kopf durch.</p>
<p>Sagen wir A.h wird zuerst vom Präprozessor behandelt, dann sieht er, dass du ja noch B.h inkludierst, also geht er dort hin und holt die rein. Das dortige A.h wird ignoriert (wegen dem Headerguard) und du hast für die Klasse B keine Definition von A. Nach der Definition von B kommt dann die Definition von A (wieder in A.h zurück).</p>
<p>Wie gesagt lies meinen Beitrag durch. Dort steht, wie du das lösen kannst (ein sehr häufiges Problem).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857634</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:09:43 GMT]]></title><description><![CDATA[<p>Aber wie ?<br />
Ich habe A und B in Sourcedateien und in den Headern &quot;class A;&quot; und &quot;class B;&quot;,<br />
aber der gibt wir wieder die Fehler</p>
<pre><code>error C2027: Verwendung des undefinierten Typs &quot;B&quot;
Siehe Deklaration von 'B'
error C2228: Links von &quot;.x&quot; muss sich eine Klasse/Struktur/Union befinden.
</code></pre>
<p>Also jetzt ohne Präprozesserbefehle.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857638</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:09:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:10:36 GMT]]></title><description><![CDATA[<p>Wenn du den kompletten Beitrag gelesen hättest, dann wüsstest du wie. Er ist nicht so lange und dort steht alles, was du wissen musst..</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857641</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:10:36 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:17:28 GMT]]></title><description><![CDATA[<blockquote>
<p>Wenn wir unsere car-Klasse ansehen, dann sehen wir, dass da <strong>lediglich Zeiger</strong> auf human gebraucht werden und eine Funktion von human wird auch nirgends aufgerufen.</p>
</blockquote>
<p>Und wie soll ich das dann bei Operatorüberladung machen ?</p>
<p>Muss ich wirklich ALLES auf Zeiger umstellen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857643</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:17:28 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:17:58 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<p>Und wie soll ich das dann bei Operatorüberladung machen ?</p>
</blockquote>
<p>Du sollst die Funktionen nicht inline definieren. Definiere sie in der .cpp-Datei, während im Header lediglich die Deklaration steht. So wie es drakon in seinem Artikel erwähnt, lies den doch endlich!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857645</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857645</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:17:58 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:24:14 GMT]]></title><description><![CDATA[<p>DarkShadow44 schrieb:</p>
<blockquote>
<blockquote>
<p>Wenn wir unsere car-Klasse ansehen, dann sehen wir, dass da <strong>lediglich Zeiger</strong> auf human gebraucht werden und eine Funktion von human wird auch nirgends aufgerufen.</p>
</blockquote>
<p>Und wie soll ich das dann bei Operatorüberladung machen ?</p>
<p>Muss ich wirklich ALLES auf Zeiger umstellen ?</p>
</blockquote>
<p>Nein. Lediglich Datenmember müssen dafür Zeiger sein. Parameter, Rückgabewerte können ganz normale Objekte sein, weil die gar nicht interessieren für die Grösse des Objektes, dass du definierst.</p>
<p>Ich hätte hier jetzt fast die Lösung gepostet, aber ich finde, dass du lieber nochmal genau nachlesen solltest. Das bringt dir auf die Dauer mehr, als wenn wir dir hier die Lösung präsentieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857648</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:24:14 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:28:57 GMT]]></title><description><![CDATA[<p>OK. Sorry, ich wusst nicht, dass man auch die Operatorüberladungs-Definition auslagern kann... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ich hatte die bisher immer im Header ^^</p>
<p>Jetzt gehts, danke <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1857654</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857654</guid><dc:creator><![CDATA[DarkShadow44]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:28:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:30:49 GMT]]></title><description><![CDATA[<p>Überladene Operatoren sind im Grunde genommen <strong>ganz normale Funktionen</strong>. Sie haben hauptsächlich eine syntaktische Sonderbehandlung (und dadurch werden auch Dinge wie Assoziativität und Priorität wichtig).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1857658</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857658</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:30:49 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu Klassen [gelöst] on Thu, 18 Feb 2010 15:31:07 GMT]]></title><description><![CDATA[<p>Das sind ganz normale Funktionen, mit ein wenig Syntax Sugar. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1857660</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1857660</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Thu, 18 Feb 2010 15:31:07 GMT</pubDate></item></channel></rss>