<?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[friend-Klasse für nur bestimmte Funktionen]]></title><description><![CDATA[<p>Ist es eigentlich möglich, dass man in einer Klasse deklarieren kann, dass eine andere Klasse als friend-Klasse gilt, die jedoch nur auf bestimmte Funktionen von der ersten Klasse zugreifen kann? Also so nach dem Motto: Klasse A erlaubt Klasse B, auf die private Funktion A::F() zuzugreifen. Alle weiteren privaten Funktionen von Klasse A sind für Klasse B nach wie vor nicht zugreifbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/286928/friend-klasse-für-nur-bestimmte-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 20 Aug 2026 18:10:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/286928.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 18 May 2011 19:42:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 19:42:26 GMT]]></title><description><![CDATA[<p>Ist es eigentlich möglich, dass man in einer Klasse deklarieren kann, dass eine andere Klasse als friend-Klasse gilt, die jedoch nur auf bestimmte Funktionen von der ersten Klasse zugreifen kann? Also so nach dem Motto: Klasse A erlaubt Klasse B, auf die private Funktion A::F() zuzugreifen. Alle weiteren privaten Funktionen von Klasse A sind für Klasse B nach wie vor nicht zugreifbar.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065475</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065475</guid><dc:creator><![CDATA[Schandmund]]></dc:creator><pubDate>Wed, 18 May 2011 19:42:26 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 19:43:53 GMT]]></title><description><![CDATA[<p>Nein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065476</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065476</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 18 May 2011 19:43:53 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 19:46:37 GMT]]></title><description><![CDATA[<p>Wozu brauchst du das?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065478</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065478</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 18 May 2011 19:46:37 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 19:52:04 GMT]]></title><description><![CDATA[<p>EOutOfResources schrieb:</p>
<blockquote>
<p>Wozu brauchst du das?</p>
</blockquote>
<p>Die Kapselung wird erhöht, wenn der Zugriff stärker eingeschränkt ist. Sollte eigentlich klar sein...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065486</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 18 May 2011 19:52:04 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 19:54:24 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>Die Kapselung wird erhöht, wenn der Zugriff stärker eingeschränkt ist.</p>
</blockquote>
<p>Ich meinte eigentlich das konkrete Problem. Nicht wozu man diese Vorgehensweise nutzt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065488</guid><dc:creator><![CDATA[EOutOfResources]]></dc:creator><pubDate>Wed, 18 May 2011 19:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 20:20:05 GMT]]></title><description><![CDATA[<p>Es geht konkret um eine Art und Weise, ein Spiel zu programmieren: Ich habe eine Sprite-Klasse und eine Screen-Klasse. Und das Sprite muss natürlich irgendwie auf den Screen gezeichnet werden. Stellen wir uns mal vor, das ganze wird mit dem Windows GDI implementiert. Dann würde die Sprite-Klasse ein HBITMAP als private Variable haben und die Screen-Klasse hätte ein HWND. Zum Zeichnen erstellt man dann lokal von beidem einen HDC und benutzt BitBlt. Aber egal, wie man es dreht und wendet: Eine Klasse braucht Zugriff auf den privaten Member der anderen:</p>
<pre><code class="language-cpp">Sprite::DrawToScreen(const Screen &amp;screen) --&gt; Sprite muss auf das HWND zugreifen können
Screen::DrawSprite(const Sprite &amp;sprite) --&gt; Screen muss auf das HBITMAP zugreifen können
</code></pre>
<p>Und eine öffentliche Funktion Sprite::GetHBitmap() möchte ich nicht machen, da ich das Interface plattform- und implementierungsunabhängig halten will. Wenn ich zum Beispiel auf DirectX wechsle, gibt es ja statt HWND und HBITMAP irgendwelche DirectX-Surfaces. Und solche spezifischen Dinge soll es nur in den CPP-Daeien geben und als private Variablen. Aber alles, was public oder protected ist, soll auch absolut unabhängig sein und soll nur das benutzen, was das reine Standard-C++ zur Verfügung stellt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065529</guid><dc:creator><![CDATA[Schandmund]]></dc:creator><pubDate>Wed, 18 May 2011 20:20:05 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 20:22:45 GMT]]></title><description><![CDATA[<p>Edit: Die eine Funktion</p>
<pre><code class="language-cpp">Sprite::DrawToScreen(const Screen &amp;screen)
</code></pre>
<p>muss natürlich so hier aussehen:</p>
<pre><code class="language-cpp">Sprite::DrawToScreen(Screen &amp;screen)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2065531</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065531</guid><dc:creator><![CDATA[Schandmund]]></dc:creator><pubDate>Wed, 18 May 2011 20:22:45 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Wed, 18 May 2011 21:56:30 GMT]]></title><description><![CDATA[<p>Man kann das was du willst über eine Zwischenklasse erreichen:</p>
<pre><code class="language-cpp">class foo
{
private:
    friend class foo_access;
    void a();
    void b();
};

class foo_access
{
private:
    friend class bar;
    static void do_a(foo&amp; f)
    {
        f.a();
    }
};

class bar
{
public:
    void c(foo&amp; f)
    {
        foo_access::do_a(f);
    }
};
</code></pre>
<p>bar kann jetzt (indirekt) foo::a verwenden, aber nicht foo::b.</p>
<p>Wobei ich das nur in echten &quot;Notfällen&quot; empfehlen würde.</p>
<p>ps: in deinem speziellen Fall würde ich entweder<br />
a) das HWND über einen ganz normalen öffentlichen Getter zur Verfügung stellen oder<br />
b) der Screen Klasse eine public BitBlt Funktion verpassen, so dass das HWND nicht &quot;herausgegeben&quot; werden muss oder<br />
c) eine der beiden Klassen zum Friend des anderen machen</p>
<p>Bei solchen Dingen hast du sowieso immer eine starke Koppelung zwischen Klassen, das lässt sich nicht vermeiden.<br />
Und der User-Programmer kann ja die &quot;friend&quot; Stellung von z.B. Sprite nicht &quot;ausnutzen&quot;, indem er von Sprite ableitet: seine abgeleitete Klasse ist ja kein friend mehr.</p>
<p>Bzw. statt &quot;Sprite&quot; sollte die Klasse die &quot;sich&quot; auf den &quot;Screen&quot; zeichnen kann vielleicht eine Ebene tiefer angesiedelt werden: eine &quot;Image&quot; Klasse, die einfach nur ein Bild kapselt. Die Sprite Klasse kann dann von der &quot;Image&quot; Klasse gebrauch machen, um etwas auf den Schirm zu zeichnen.</p>
<p>Viele Wege führen nach Rom. Das oben gezeigte (&quot;friend&quot; über Umwegen) würde ich in so einem Fall nicht verwenden. Ist unnötig kompliziert und verwirrt nur.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065564</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065564</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Wed, 18 May 2011 21:56:30 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Thu, 19 May 2011 07:32:19 GMT]]></title><description><![CDATA[<p>Schandmund schrieb:</p>
<blockquote>
<p>Ist es eigentlich möglich, dass man in einer Klasse deklarieren kann, dass eine andere Klasse als friend-Klasse gilt, die jedoch nur auf bestimmte Funktionen von der ersten Klasse zugreifen kann? Also so nach dem Motto: Klasse A erlaubt Klasse B, auf die private Funktion A::F() zuzugreifen. Alle weiteren privaten Funktionen von Klasse A sind für Klasse B nach wie vor nicht zugreifbar.</p>
</blockquote>
<p>Es geht aber anderstrum. Ist jetzt vermutlich nicht unbedingt die Lösung für<br />
dein Problem, aber vielleicht kanntest du ja diese Möglichkeit noch nicht:</p>
<pre><code class="language-cpp">//--------------------------------------------------------------------
// Diese Klasse ruft eine private Funktion auf
//------------------------------------------------------------
class CIchBinDeinFreund
{
   public:
      void PrivateFunktionAufrufen( CWerWillMeinFrundSein* a_pFreund );
};

//------------------------------------------------------------
// Die private Funktion dieser Klasse soll aufgerufen werden
//------------------------------------------------------------
class CWerWillMeinFrundSein
{
   private:
      friend void CIchBinDeinFreund::PrivateFunktionAufrufen( CWerWillMeinFrundSein* a_pFreund );
      void AusgabeIrgendwas();
};

//------------------------------------------------------------
// Funktionen definieren
//------------------------------------------------------------
void CIchBinDeinFreund::PrivateFunktionAufrufen( CWerWillMeinFrundSein* a_pFreund )
{
   a_pFreund-&gt;AusgabeIrgendwas();
}

void CWerWillMeinFrundSein::AusgabeIrgendwas()
{
   // hier irgendwas machen
}

//------------------------------------------------------------
// Aufruf der privaten Funktion im Quellcode...
//------------------------------------------------------------

CWerWillMeinFrundSein DrueckMich;

CIchBinDeinFreund Freund;
Freund.PrivateFunktionAufrufen( &amp;DrueckMich );
</code></pre>
<p>Gruß Ulli</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065644</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065644</guid><dc:creator><![CDATA[CUlli]]></dc:creator><pubDate>Thu, 19 May 2011 07:32:19 GMT</pubDate></item><item><title><![CDATA[Reply to friend-Klasse für nur bestimmte Funktionen on Thu, 19 May 2011 07:38:08 GMT]]></title><description><![CDATA[<p>Ein weiterer Trick wäre die Verwendung des <a href="http://www.informit.com/guides/content.aspx?g=cplusplus&amp;seqNum=242&amp;rll=1" rel="nofollow">Handle Body Idioms</a>, nur in diesem Fall nicht zur Auslagerung von Daten, sondern auch privaten Methoden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2065647</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2065647</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 19 May 2011 07:38:08 GMT</pubDate></item></channel></rss>