<?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 friend-classes]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe in meinem Projekt für jede Klasse eine eigene Datei die jeweils<br />
einen &quot;Guard&quot; am Anfang des Headers haben:</p>
<pre><code class="language-cpp">#ifndef __TESTCLASS1_H__
#define __TESTCLASS1_H__

/* class TestClass1 { ... } */

#endif
</code></pre>
<p>Nun habe ich einige Klassen, die sich beide 'kennen' sollen bzw. die jeweils einen Pointer auf ein Objekt der anderen Klasse haben:</p>
<pre><code class="language-cpp">// TestClass1.hpp
class TestClass1
{
    TestClass2* Member;
};

// TestClass2.hpp
class TestClass2
{
    TestClass1* Member;
};
</code></pre>
<p>Jetzt sollen diese auch noch beide Freunde sein (mit &quot;friend class ...&quot;).<br />
Allerdings kann ich ja nicht einfach in beiden Dateien die jeweils andere inkluden, sonst wäre das ja eine Endlosschleife:</p>
<pre><code class="language-cpp">// TestClass1.hpp
#include &quot;TestClass2.hpp&quot;
// ...

// TestClass2.hpp
#include &quot;TestClass1.hpp&quot;
// ...
</code></pre>
<p>Also habe ich einfach nur jeweils die andere Klasse deklariert (mit &quot;class TestClass1;&quot;).<br />
Jetzt meckert aber der Kompiler immer noch, dass die Members der anderen Klasse privat oder eben geschützt seien.</p>
<p>Wie kann ich das Problem beheben? Vielleicht ist ja der Compiler mit der Deklaration nicht einverstanden?!</p>
<p>Ich hatte solche Probleme schon öfters, aber diesmal weiß ich einfach nicht was ich falsch mache <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>
<p>Danke schonmal im Voraus. <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/topic/250558/problem-mit-friend-classes</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 23:42:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250558.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 20 Sep 2009 10:20:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 10:20:55 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>ich habe in meinem Projekt für jede Klasse eine eigene Datei die jeweils<br />
einen &quot;Guard&quot; am Anfang des Headers haben:</p>
<pre><code class="language-cpp">#ifndef __TESTCLASS1_H__
#define __TESTCLASS1_H__

/* class TestClass1 { ... } */

#endif
</code></pre>
<p>Nun habe ich einige Klassen, die sich beide 'kennen' sollen bzw. die jeweils einen Pointer auf ein Objekt der anderen Klasse haben:</p>
<pre><code class="language-cpp">// TestClass1.hpp
class TestClass1
{
    TestClass2* Member;
};

// TestClass2.hpp
class TestClass2
{
    TestClass1* Member;
};
</code></pre>
<p>Jetzt sollen diese auch noch beide Freunde sein (mit &quot;friend class ...&quot;).<br />
Allerdings kann ich ja nicht einfach in beiden Dateien die jeweils andere inkluden, sonst wäre das ja eine Endlosschleife:</p>
<pre><code class="language-cpp">// TestClass1.hpp
#include &quot;TestClass2.hpp&quot;
// ...

// TestClass2.hpp
#include &quot;TestClass1.hpp&quot;
// ...
</code></pre>
<p>Also habe ich einfach nur jeweils die andere Klasse deklariert (mit &quot;class TestClass1;&quot;).<br />
Jetzt meckert aber der Kompiler immer noch, dass die Members der anderen Klasse privat oder eben geschützt seien.</p>
<p>Wie kann ich das Problem beheben? Vielleicht ist ja der Compiler mit der Deklaration nicht einverstanden?!</p>
<p>Ich hatte solche Probleme schon öfters, aber diesmal weiß ich einfach nicht was ich falsch mache <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>
<p>Danke schonmal im Voraus. <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/1781666</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781666</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sun, 20 Sep 2009 10:20:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 10:37:29 GMT]]></title><description><![CDATA[<p>So viel ich weiß muss die Klasse bei friend class ... weder definiert noch deklariert sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781669</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781669</guid><dc:creator><![CDATA[ipsec]]></dc:creator><pubDate>Sun, 20 Sep 2009 10:37:29 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 11:12:19 GMT]]></title><description><![CDATA[<p>Wenn du in Klasse A einfach ein &quot;friend class B&quot; schreibst reicht das vollkommen aus, ohne dass du B vorher irgendwie erwähnt haben müsstest. Du kannst per friend-Deklaration gleichzeitig eine völlig neue Klasse deklarieren (aber nicht definierern).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781681</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Sun, 20 Sep 2009 11:12:19 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 11:20:09 GMT]]></title><description><![CDATA[<p>Achso, vielleicht habe ich dadurch ja eine falsche friend-Deklaration geschrieben.<br />
Ich habe bei meinem Klassen immer noch sowas wie &quot;APP_EXPORT&quot; welches ~ so definiert ist:</p>
<pre><code class="language-cpp">// Globals.hpp
#ifdef __EXPORT_TO_LIBRARY__
#    if defined(WIN32)
#        define APP_EXPORT __declspec(dllexport)
#    elif defined(__linux__)
#        define APP_EXPORT
#    endif
#else
#    define APP_EXPORT
#endif

// ClassA.hpp
class APP_EXPORT ClassA { /* ... */ };

// ClassB.hpp
class APP_EXPORT ClassB
{
    friend ClassA;            // So? ...
    friend APP_EXPORT ClassA; // ... oder so?
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781684</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781684</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sun, 20 Sep 2009 11:20:09 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 12:38:37 GMT]]></title><description><![CDATA[<p>Hier habe ich ein Beispiel wie es bei mir aussieht, ihr könnt versuchen das zu kompilieren. Und hier tritt genau der gleiche Fehler auf.<br />
Ich habe das Problem unter <em>Linux</em> genau so wie unter <em>Windows</em>:</p>
<pre><code class="language-cpp">#include &lt;cstdlib&gt;

namespace space1
{

class ClassA
{
    int Data;
    ClassA();
};

}

namespace space1
{
namespace space2
{

class ClassB
{
    friend class ClassA;
    int Data;
    ClassB() : Data(0)
    {
    }
};

}
}

namespace space1
{

ClassA::ClassA()
{
    space2::ClassB Obj;
    Data = Obj.Data;
}

}

int main()
{
    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781720</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781720</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sun, 20 Sep 2009 12:38:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 12:48:54 GMT]]></title><description><![CDATA[<p>Also das kompiliert bei mir ohne Probleme. (VS 2008).</p>
<p>Zeig mal den genauen Fehler.</p>
<p>Du hast hier bei den Klassen nämlich keine public Spezifizierer und somit ist auch der Konstruktor privat.. So kannst du kein Objekt erstellen. <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>EDIT:<br />
Worauf du auch noch achten musst ist, dass du die Memberfunktionen nicht im Header implementieren darfst, weil sonst (wenn du die andere Klasse brauchst) natürlich die genaue Implementierung bekannt sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781723</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781723</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Sun, 20 Sep 2009 12:48:54 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 13:05:50 GMT]]></title><description><![CDATA[<p>Ich hab GCC 4.x unter Linux aber unter Windows habe ich mit dem GNU C++ Compiler das selbe Problem.</p>
<pre><code>29    Fehler: &gt;&gt;int space1::space2::ClassB::Data&lt;&lt; ist privat
44    Fehler: in diesem Zusammenhang
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1781729</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781729</guid><dc:creator><![CDATA[LukasBanana]]></dc:creator><pubDate>Sun, 20 Sep 2009 13:05:50 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit friend-classes on Sun, 20 Sep 2009 13:44:50 GMT]]></title><description><![CDATA[<p>Beachte die namespaces. Eine friend-Deklaration deklariert die Klasse im umgebenden Namensraum. D.h. du deklarierst space2::ClassA als friend, die du garnicht definierst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1781746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1781746</guid><dc:creator><![CDATA[Don06]]></dc:creator><pubDate>Sun, 20 Sep 2009 13:44:50 GMT</pubDate></item></channel></rss>