<?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[Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen]]></title><description><![CDATA[<p>Hi,<br />
ich habe zwei Klassen, die eine hat Funktionen, die Objekte der anderen Klasse als Argument erhalten. Als Beispiel:</p>
<pre><code class="language-cpp">class Grippe
{
    public:
        void ArtBestimmen(Virus EinVirus)
        {
        ...
        }
...
}
</code></pre>
<p>Und die Klasse Virus sieht dann so aus:</p>
<pre><code class="language-cpp">class Virus
{
    friend void Grippe::ArtBestimmen(Virus EinVirus);

    protected:
        int Art; //Das möchte die Funktion in Grippe auslesen
}
</code></pre>
<p>Das nur so als Beispiel für mein Problem. Nun möchte Grippe, dass ich erst den Header Virus.h einbinde, damit es die Klasse Virus kennt. Virus.h hingegen fordert zuerst eine Deklaration von Grippe wegen des friend Befehls. Wie komme ich jetzt aus der Zwickmühle raus? <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/topic/246943/anfängerproblem-klassen-benötigen-gegenseitig-eine-deklaration-der-jeweils-anderen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 17 Sep 2026 17:39:35 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/246943.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 03 Aug 2009 22:20:16 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:11:15 GMT]]></title><description><![CDATA[<p>Hi,<br />
ich habe zwei Klassen, die eine hat Funktionen, die Objekte der anderen Klasse als Argument erhalten. Als Beispiel:</p>
<pre><code class="language-cpp">class Grippe
{
    public:
        void ArtBestimmen(Virus EinVirus)
        {
        ...
        }
...
}
</code></pre>
<p>Und die Klasse Virus sieht dann so aus:</p>
<pre><code class="language-cpp">class Virus
{
    friend void Grippe::ArtBestimmen(Virus EinVirus);

    protected:
        int Art; //Das möchte die Funktion in Grippe auslesen
}
</code></pre>
<p>Das nur so als Beispiel für mein Problem. Nun möchte Grippe, dass ich erst den Header Virus.h einbinde, damit es die Klasse Virus kennt. Virus.h hingegen fordert zuerst eine Deklaration von Grippe wegen des friend Befehls. Wie komme ich jetzt aus der Zwickmühle raus? <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/1754849</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754849</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:11:15 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 22:50:06 GMT]]></title><description><![CDATA[<p>Das klingt erst mal nach einem möglicherweisen suboptimalen Design. Versuche, die Abhängigkeiten zu reduzieren. Wenn das nicht geht -- also Klasse A von B abhängt und umgekehrt -- dann kannst Du Definitionen ja in einer Datei zusammenfassen und mit Vorwärtsdeklarationen arbeiten. Und Wenn selbst das nicht geht, machst Du Design-technisch wirklich etwas falsch.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754857</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754857</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Mon, 03 Aug 2009 22:50:06 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 22:55:14 GMT]]></title><description><![CDATA[<p>Die Klassen greifen exakt wie in meinem Beispiel aufeinander zu. Die Funktion der einen Klasse braucht die Variablen der anderen Klasse und deshalb ist die Funktion in der anderen Klasse als friend eingetragen. Gibt es eine Möglichkeit das anders zu lösen? Theoretisch könnte ich die Funktion auch aus der Klasse herausnehmen und zum friend beider Klassen machen. Das müsste gehen, aber ist irgendwie eine unschöne Lösung finde ich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754859</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754859</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Mon, 03 Aug 2009 22:55:14 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:16:03 GMT]]></title><description><![CDATA[<p>EDIT: Hat sich erledigt, hatte hier stehen, dass ich die Funktion jetzt doch einfach aus der Klasse herausnehme und das Problem damit behoben ist, aber dazu einfach einen Post weiter unten schauen bitte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754860</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754860</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:16:03 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:14:45 GMT]]></title><description><![CDATA[<p>Ich habe es umgeschrieben und festgestellt, dass ich so wieder auf das selbe Problem stoße. Nun ist die außenstehende Funktion friend von beiden Klassen und bekommt Objekte beider Klassen als Argument, also haben beide Klassen einen friend-Befehl mit einem Objekt der anderen Klasse in den Argumenten. Also will auch jede Klasse die andere wieder zuerst deklarieren. Gibt es denn da keinen Ausweg? Ich kann ja nicht die Variablen der Klassen public machen. C++ scheint mich aber dazu zwingen zu wollen. Eine andere Lösung fällt mir nicht ein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754865</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754865</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:14:45 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:17:27 GMT]]></title><description><![CDATA[<p>Übergib Referenzen (auf const), dann reichen Forward-Deklarationen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754866</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754866</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:17:27 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:25:10 GMT]]></title><description><![CDATA[<p>Sorry, aber ich bin noch ein ziemlicher Anfänger. Referenzen versteh ich, nutze ich ja auch schon:</p>
<p>Die kleinere Funktion:</p>
<pre><code class="language-cpp">void Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
</code></pre>
<p>Aber wieso Referenzen auf Konstanten? Ich ändere die Werte der Objekte, da wären Konstanten ja genau das falsche oder weiß ich da was nicht? <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>Und mit Forward-Deklarationen meinst du einfach, dass ich dann die beiden Klassen ganz normal nacheinander bzw. unabhängig voneinander Deklarieren kann?</p>
<p>Danke schonmal für die Hilfe <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/1754868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754868</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:25:10 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:30:18 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<p>Sorry, aber ich bin noch ein ziemlicher Anfänger. Referenzen versteh ich, nutze ich ja auch schon:</p>
<p>Die kleinere Funktion:</p>
<pre><code class="language-cpp">void Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
</code></pre>
<p>Aber wieso Referenzen auf Konstanten? Ich ändere die Werte der Objekte, da wären Konstanten ja genau das falsche oder weiß ich da was nicht? <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>Und mit Forward-Deklarationen meinst du einfach, dass ich dann die beiden Klassen ganz normal nacheinander bzw. unabhängig voneinander Deklarieren kann?</p>
<p>Danke schonmal für die Hilfe <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>Wenn du die Objekte änderst, kannst du natürlich kein const nehmen. Forward Deklaration bedeutet einfach, dass du beispielsweise folgendes machst:</p>
<p>Header:</p>
<pre><code class="language-cpp">void Kollisionsabfrage(class Ball&amp; ball, class Spieler&amp; spieler);
</code></pre>
<p>Cpp:</p>
<pre><code class="language-cpp">#include &quot;Header.h&quot;
#include &quot;Ball.h&quot;
#include &quot;Spieler.h&quot;

void Kollisionsabfrage(class Ball&amp; ball, class Spieler&amp; spieler)
{
 // ...
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754871</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754871</guid><dc:creator><![CDATA[asdasdasd]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:30:18 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Mon, 03 Aug 2009 23:43:19 GMT]]></title><description><![CDATA[<p>Üblicher so:<br />
Header:</p>
<pre><code class="language-cpp">class Ball;
class Spieler;
void Kollisionsabfrage(Ball&amp; ball,Spieler&amp; spieler);
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754873</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754873</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Mon, 03 Aug 2009 23:43:19 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 07:31:46 GMT]]></title><description><![CDATA[<p>Ah, das ist mir neu. Vielen Dank für eure Hilfe. Also mit</p>
<pre><code class="language-cpp">class Klassenname;
</code></pre>
<p>Kann ich einfach einen Klassennamen deklarieren, damit ich diese Klasse als Argument verwenden kann?</p>
<p>Nun beschwert sich der Compiler aber, dass alle Variablen protected sind, obwohl die Funktion ja friend der beiden Klassen ist:</p>
<pre><code>C:\...\Ball.h|27|error: `double Ball::dPosX' is protected|
C:\...\Kollisionsabfrage.cpp|9|error: within this context|
etc.
</code></pre>
<p>EDIT: Ich hab solange gegoogled, bis ich wieder hier bei diesem Thema rauskam. Laut Google müsste es funktionieren. Irgendwie liest mein Compiler anscheinend erst die Funktion und erst dann die Klassen und weiß deshalb zum Zeitpunkt an dem er an der Funktion ist noch nicht, dass diese ein friend der Klassen ist. Kann das sein?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754878</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754878</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 04 Aug 2009 07:31:46 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 07:47:33 GMT]]></title><description><![CDATA[<p>Ich habe eine mögliche Lösung hier gefunden:</p>
<p><a href="http://www.idevgames.com/forum/archive/index.php/t-11562.html" rel="nofollow">http://www.idevgames.com/forum/archive/index.php/t-11562.html</a></p>
<p>Im letzten Post steht, dass es helfen würde, die klassen und ihre friend-Funktion in den selben namespace zu schieben und diesen auch in der friend-Deklaration zu verwenden. Ich habe den Namespace Game erstellt, aber dadurch hat sich nichts geändert. Weiterhin ignoriert der Compiler fröhlich die friend-Anweisungen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754935</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754935</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 04 Aug 2009 07:47:33 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 10:01:11 GMT]]></title><description><![CDATA[<p>Ich stelle mal alle Header und die Funktion an sich hier rein, vielleicht sieht ja jemand den Fehler.</p>
<p>Ball.h</p>
<pre><code class="language-cpp">namespace Game
{
    class Ball
    {
        class Spieler;
        class SDL_Surface;

        friend void Game::Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
        friend void Game::Kollisionsabfrage(SDL_Surface *screen, Spieler &amp;Spieler1,
                                              Spieler &amp;Spieler2, Ball &amp;Ball);

        public:
            Ball(int* SpielfeldversatzX, int* SpielfeldX, int* SpielfeldversatzY,
                 int* SpielfeldY);
            void Reset(int* SpielfeldversatzX, int* SpielfeldX,
                       int* SpielfeldversatzY, int* SpielfeldY,
                       int Aufschlagspieler);
            void PositionBerechnen();
            void SpeedCheck();
            void Abdecken(SDL_Surface *screen);
            void Darstellen(SDL_Surface *screen);

        protected:
            double dPosX;
            double dPosY;
            int w;
            int h;
            double dSpeedX;
            double dSpeedY;
    };
}
</code></pre>
<p>Spieler.h</p>
<pre><code class="language-cpp">namespace Game
{
    class Spieler
    {
        class Ball;
        class SDL_Surface;

        friend void Game::Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
        friend void Game::Kollisionsabfrage(SDL_Surface *screen, Spieler &amp;Spieler1,
                                      Spieler &amp;Spieler2, Ball &amp;Ball);

        public:
            Spieler(int* SpielfeldversatzX, int* SpielfeldX, int* SpielfeldversatzY,
                    int* SpielfeldY, int AILevel);
            void SpielerSteuerung(bool *laeuft, int* SpielfeldX,
                                  int* SpielfeldversatzY, int* SpielfeldY);
            void PositionBerechnen();
            void Abdecken(SDL_Surface *screen);
            void Darstellen(SDL_Surface *screen);

        protected:
            double dPosX;
            double dPosY;
            int w;
            int h;
            int Punkte;
            int AILevel; //0 bedeutet es ist ein vom Spieler gesteuerter Spieler
            double dSpeedY;
    };
}
</code></pre>
<p>Kollisionsabfrage.h</p>
<pre><code class="language-cpp">#ifndef _BALL_H_
#define _BALL_H_
#include &quot;Ball.h&quot;
#endif

#ifndef _SPIELER_H_
#define _SPIELER_H_
#include &quot;Spieler.h&quot;
#endif

#ifndef _SDL_H_
#define _SDL_H_
#include &quot;C:/Programme/CodeBlocks/SDL-1.2.13/include/SDL.h&quot;
#endif

class Ball;
class Spieler;

namespace Game
{
    void Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);

    void Kollisionsabfrage(SDL_Surface *screen, Spieler &amp;Spieler1,
                           Spieler &amp;Spieler2, Ball &amp;Ball);
}
</code></pre>
<p>Und Kollisionsabfrage.cpp:</p>
<pre><code class="language-cpp">#ifndef _KOLLISIONSABFRAGE_H_
#define _KOLLISIONSABFRAGE_H_
#include &quot;Kollisionsabfrage.h&quot;
#endif

void Game::Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler)
{
    //Kontrollieren ob Ball Spieler von der Seite überschneiden würde
    if ((Ball.dPosX &lt;= (Spieler.dPosX + Spieler.w)) &amp;&amp;
       ((Ball.dPosX + Ball.w) &gt;= Spieler.dPosX))
    {
        //Kontrollieren ob Ball Spieler von O./U. überschneiden würde
        if ((Ball.dPosY &lt;= (Spieler.dPosY + Spieler.h)) &amp;&amp;
           ((Ball.dPosY + Ball.h) &gt;= Spieler.dPosY))
        {
            //Geschwindigkeit ändern
            Ball.dSpeedY += Spieler.dSpeedY;
            Ball.dSpeedX = - (Ball.dSpeedX + Spieler.dSpeedY/2 ) / 2;

            //Position ändern, damit nicht überschneiden
            if ((Ball.dPosX &lt;= (Spieler.dPosX + Spieler.w)/2) &amp;&amp;
               (Ball.dPosX &gt;= Spieler.dPosX))
            {
                Ball.dPosX = Spieler.dPosX - Ball.w - 1;
            }

            if ((Ball.dPosX &gt;= (Spieler.dPosX + Spieler.w)/2) &amp;&amp;
               (Ball.dPosX &lt;= (Spieler.dPosX + Spieler.w)))
            {
                Ball.dPosX = Spieler.dPosX + Spieler.w + 1;
            }

            if ((Ball.dPosY &lt;= (Spieler.dPosY + Spieler.h)/2) &amp;&amp;
               (Ball.dPosY &gt;= Spieler.dPosY))
            {
                Ball.dPosY = Spieler.dPosY - Ball.h - 1;
            }

            if ((Ball.dPosY &gt;= (Spieler.dPosY + Spieler.h)/2) &amp;&amp;
               (Ball.dPosY &lt;= (Spieler.dPosY + Spieler.h)))
            {
                Ball.dPosY = Spieler.dPosY + Spieler.h + 1;
            }
        }
    }
}

void Kollisionsabfrage(SDL_Surface *screen, Spieler &amp;Spieler1,
                       Spieler &amp;Spieler2, Ball &amp;Ball)
{
    if (Ball.dPosX &lt;= 0)
    {
        Spieler2.Punkte++;
        Ball::Reset();
    }

    if (Ball.dPosY &lt;= 0)
    {
        Ball.dSpeedY = -Ball.dSpeedY;
        Ball.dPosY = 1;
    }

    if ((Ball.dPosX + Ball.w) &gt;= (screen-&gt;w))
    {
        Spieler1.Punkte++;
        Ball::Reset();
    }

    if ((Ball.dPosY + Ball.h) &gt;= (screen-&gt;h))
    {
        Ball.dSpeedY = -Ball.dSpeedY;
        Ball.dPosY = (screen-&gt;h - 1);
    }
}
</code></pre>
<p>Sieht jemand einen Grund, warum Kollisionsabfrage nicht als friend von Ball und Spieler gesehen wird? Notfalls müsste ich die Klassen Ball und Spieler um Funktionen für jede einzelne Variable ergänzen, die diese jeweils ausgeben. Aber das wäre ziemlich unschön. <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/1754991</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754991</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 04 Aug 2009 10:01:11 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 10:13:24 GMT]]></title><description><![CDATA[<p>Normalerweise kommen Header Guards in den Header und nicht in die .cpp.. <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="🙄"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1754996</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754996</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 04 Aug 2009 10:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 10:15:09 GMT]]></title><description><![CDATA[<p>Die Forward-Declarations dürfen nciht innerhalb der Klasse stehen, damit deklarierst du Unterklassen Spieler::Ball bzw. Ball::Spieler. Die friend-deklarationen beziehen sich dann automatisch auf diese Unterklassen, so dass z.B.<br />
[c]void Game::Kollisionsabfrage(Ball &amp;Ball, **Bal::**Spieler &amp;Spieler);[/c] ein friend von Ball wäre. Pack die Forward-Deklarations in den Scope wo sie hingehören, d.h. außerhalb der Klassen, innerhalb des Namespace:</p>
<pre><code class="language-cpp">namespace Game
{
    class Spieler; //Fwd-Decl
    class SDL_Surface; //Fwd-Decl;

    class Ball
    {

        friend void Game::Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
//...
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1754997</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1754997</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 04 Aug 2009 10:15:09 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 11:35:38 GMT]]></title><description><![CDATA[<p>Ich komme nochmal auf mein &quot;Abhängigkeiten reduzieren&quot;-Punkt. Die Kollisionsabfrage bei Dir greift direkt auf geschützte Objekt-Elemente von Ball und Spieler zu. Das ist schlecht. Du solltest dafür Funktionen zur Verfügung stellen, die man in kollisionsabfrage() einfach aufrufen kann. Damit ersparst Du Dir auch die sonst nötigen friend-Deklarationen.</p>
<p>Eventuell kannst Du die Objekteigenschaften, die Du in Kollisionsabfrage benutzt, abstrahieren. ZB so:</p>
<pre><code class="language-cpp">struct Vec2d
{
  double xy[2];

  explicit Vec2d(double x=0, double y=0)
  { xy[0]=x; xy[1] = y; }

  double&amp;       x()       {return xy[0];}
  double const&amp; x() const {return xy[0];}
  double&amp;       y()       {return xy[1];}
  double const&amp; y() const {return xy[1];}
};

class Objekt2D
{
protected:
  ~Objekt2D() {} // alternativ: public und virtuell
public:
  Vec2d position() const = 0;
  Vec2d groesse() const = 0;
  Vec2d geschwindigkeit() const = 0;
  void position(Vec2d p) = 0;
  void geschwindigkeit(Vec2d p) = 0;
};

class Ball : public Objekt2D
{
  ...
};

class Spieler : public Objekt2D
{
  ...
};

void kollisionsabfrage(Objekt2D &amp; o1, Objekt2D &amp; o2)
{
  ...
}
</code></pre>
<p>...ist ja nur ein Vorschlag.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755012</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755012</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 11:35:38 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 11:48:09 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class Objekt2D
{
protected:
  ~Objekt2D() {} // alternativ: public und virtuell
public:
  Vec2d position() const = 0;
  Vec2d groesse() const = 0;
  Vec2d geschwindigkeit() const = 0;
  void position(Vec2d p) = 0;
  void geschwindigkeit(Vec2d p) = 0;
};
</code></pre>
<p>Nachtrag: Vor jede Funktionsdeklaration im public-Bereich gehört noch ein &quot;virtual&quot;.</p>
<p>Diese Klassendefinition könntest Du in einen eigenen Header packen, der dann für die &quot;Kollisionsabfrage&quot;-Funktion eingebunden wird, so dass diese nichts von Spieler oder Ball wissen muss.</p>
<p>Zumindest ist es erstrebenswert, die Programmteile weitestgehend zu <a href="http://de.wikipedia.org/wiki/Kopplung_(Softwareentwicklung)#Kopplung_von_Modulen" rel="nofollow">entkoppeln</a>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755022</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755022</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 11:48:09 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 12:08:58 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct Vec2d
{
  double xy[2];
</code></pre>
</blockquote>
<p>Warum Du auch? Von Dir hätte ich</p>
<pre><code class="language-cpp">struct Vec2d
{
  double x;
  double y;
</code></pre>
<p>erwartet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755037</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755037</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 04 Aug 2009 12:08:58 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 13:11:30 GMT]]></title><description><![CDATA[<p>Um ehrlich zu sein habe ich keine Ahnung, was:</p>
<pre><code class="language-cpp">explicit Vec2d(double x=0, double y=0)
  { xy[0]=x; xy[1] = y; }

  double&amp;       x()       {return xy[0];}
  double const&amp; x() const {return xy[0];}
  double&amp;       y()       {return xy[1];}
  double const&amp; y() const {return xy[1];}
</code></pre>
<p>macht.</p>
<blockquote>
<p>Vor jede Funktionsdeklaration im public-Bereich gehört noch ein &quot;virtual&quot;.</p>
</blockquote>
<p>Ich brauch doch nur virtuelle Funktionen, wenn die Klasse erbt oder vererbt, oder?</p>
<p>Aber euch allen schonmal vielen Dank für den Hinweis mit den Klassendeklarationen in den Klassen. <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/1755080</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755080</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:11:30 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 13:31:43 GMT]]></title><description><![CDATA[<p>Nochmal ganz kurz zwei Sachen^^.</p>
<p>pumuckles Problemlösung hat wieder ein neues Problem hervorgerufen:</p>
<pre><code class="language-cpp">namespace Game
{
    class Spieler; //Fwd-Decl
    class SDL_Surface; //Fwd-Decl;

    class Ball
    {

        friend void Game::Kollisionsabfrage(Ball &amp;Ball, Spieler &amp;Spieler);
//...
</code></pre>
<pre><code>C:\...\Kollisionsabfrage.cpp|66|error: invalid use of undefined type `struct Game::SDL_Surface'|
</code></pre>
<p>SDL_Surface darf nicht zum namespace Game gehören, sonst funktioniert es nicht mehr. Ich habs jetzt einfach außerhalb geschrieben und das geht.</p>
<p>EDIT: Und das zweite Problem hat sich mir grad auch erschlossen. Nur irgendwie bin ich zu blöd, es richtig zu schreiben.</p>
<p>Ich muss der Elementfunktion (heißt doch so, oder? <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="😕"
    /> ) Reset ein Objekt mitgeben. Ich wollte das so machen, wobei das Objekt auch Ball heißt:</p>
<pre><code class="language-cpp">Ball::Ball.Reset(SpielfeldversatzX, SpielfeldX, SpielfeldversatzY,
                         SpielfeldY, 2);
</code></pre>
<p>Der Compiler meint dazu nur:</p>
<pre><code>C:\...\Kollisionsabfrage.cpp|56|error: expected unqualified-id before '.' token|
</code></pre>
<p>Nehme ich anstatt Ball irgendeinen anderen Begriff als Objektnamen, um den Compiler nicht zu verwirren <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="😉"
    /> , dann schreibt er stattdessen:</p>
<pre><code>C:\...\Kollisionsabfrage.cpp|56|error: `Kugel' is not a member of `Game::Ball'|
</code></pre>
<p>Wie schreibe ich denn eine Elementfunktion im namespace so, dass der Compiler versteht, was ich meine?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755091</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755091</guid><dc:creator><![CDATA[Little Programmer]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:31:43 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 13:58:14 GMT]]></title><description><![CDATA[<p>Little Programmer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">Ball::Ball.Reset(SpielfeldversatzX, SpielfeldX, SpielfeldversatzY,
                         SpielfeldY, 2);
</code></pre>
</blockquote>
<p>Gibt es den namespace Ball? Und was meinst du mit &quot;ein Objekt mitgeben&quot;?<br />
Wenn du ein Objekt einBall vom Typ Game::Ball hast, rufst du die Elementfunktion Reset so auf: einBall.Reset(...);</p>
<p>Es ist übrigens eine schlechte Idee, Objekte wie ihre Klasse zu nennen, das führt nur zu Problemen.<br />
Besser so:</p>
<pre><code class="language-cpp">Ball ball; //Objektnamen immer klein schreiben
TBall Ball; //Borland-Art
BG_Ball Ball; //Projektkürzel voranstellen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1755117</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755117</guid><dc:creator><![CDATA[Nanyuki]]></dc:creator><pubDate>Tue, 04 Aug 2009 13:58:14 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 14:38:30 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<pre><code class="language-cpp">struct Vec2d
{
  double xy[2];
</code></pre>
</blockquote>
<p>Warum Du auch? Von Dir hätte ich</p>
<pre><code class="language-cpp">struct Vec2d
{
  double x;
  double y;
</code></pre>
<p>erwartet.</p>
</blockquote>
<p>*mit-den-Achseln-zuck*</p>
<p>Es wär doch nett, wenn man die Komponenten per Index ansprechen könnte.</p>
<p>Gruß,<br />
SP</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755151</guid><dc:creator><![CDATA[Sebastian Pizer]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:38:30 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 14:46:37 GMT]]></title><description><![CDATA[<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Es wär doch nett, wenn man die Komponenten per Index ansprechen könnte.</p>
</blockquote>
<p>Einfach nur so, ohne einen Algorithmus im Sinn, wo man das brauchen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755156</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755156</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 14:49:44 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Sebastian Pizer schrieb:</p>
<blockquote>
<p>Es wär doch nett, wenn man die Komponenten per Index ansprechen könnte.</p>
</blockquote>
<p>Einfach nur so, ohne einen Algorithmus im Sinn, wo man das brauchen könnte.</p>
</blockquote>
<p>Einfach nur so, wissend dass es durchaus einen Algorithmus geben kann den man grade nicht im Sinn hat. Und dass es auf die Performance, den Speicherverbrauch und das Interface keinen Einfluss hat. Nur auf die Erweiterbarkeit eben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755157</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 04 Aug 2009 14:49:44 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 15:08:17 GMT]]></title><description><![CDATA[<p>pumuckl schrieb:</p>
<blockquote>
<p>Einfach nur so, wissend dass es durchaus einen Algorithmus geben kann den man grade nicht im Sinn hat.</p>
</blockquote>
<p>Dann mußt Du aber auch Nägel mit Köpfen machen und eine Fahrrad&amp; getFahrrad() anbieten, einfach nur so, weil es einen Algorithmus geben könnte, der eun Fahrrad brauchen könnte. Würde ich nie machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755166</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755166</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Tue, 04 Aug 2009 15:08:17 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 15:46:06 GMT]]></title><description><![CDATA[<p>volkard schrieb:</p>
<blockquote>
<p>Dann mußt Du aber auch Nägel mit Köpfen machen und eine Fahrrad&amp; getFahrrad() anbieten, einfach nur so, weil es einen Algorithmus geben könnte, der eun Fahrrad brauchen könnte.</p>
</blockquote>
<p>Nein, im Gegensatz zu der Entscheidung 2 x double &lt;-&gt; double[2] wäre das ein Eingriff ins Interface der Klasse, der zu dem Zeitpunkt (noch) nicht nötig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755194</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755194</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 04 Aug 2009 15:46:06 GMT</pubDate></item><item><title><![CDATA[Reply to Anfängerproblem: Klassen benötigen gegenseitig eine Deklaration der jeweils Anderen on Tue, 04 Aug 2009 16:03:58 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/9960">@pumuckl</a> &amp; Sebastian Pizer,<br />
Wieso nicht eher sowas?</p>
<pre><code class="language-cpp">struct Vec2d
{
  double x;
  double y;

  double&amp; operator [](std::size_t index)
  {
    assert(index &lt; 2);
    return (index == 0 ? x : y);
  }

  double operator [](std::size_t index) const
  {
    assert(index &lt; 2);
    return (index == 0 ? x : y);
  }
};
</code></pre>
<p>Würde ich irgendwie als schöner empfinden <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>Grüssli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1755200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1755200</guid><dc:creator><![CDATA[Dravere]]></dc:creator><pubDate>Tue, 04 Aug 2009 16:03:58 GMT</pubDate></item></channel></rss>