<?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[Datenkapselung und &#x27;friend&#x27;]]></title><description><![CDATA[<p>Hey,</p>
<p>mal eine eher grundsätzliche Frage:<br />
C++ erlaubt es ja, mit dem friend-Keyword auf private elemente einer Klasse zuzugreifen.<br />
Angenommen ich schreibe eine Library 'libFoo' für irgendwas und jemand bindet diese Library in sein Programm ein und inkludiert dazu den Header 'libFoo.h', wo die Klassendeklaration drin ist:</p>
<pre><code class="language-cpp">class CFoo
{
public:
    //bla
protected:
    //bla
private:
    string mGeheimerText;
};
</code></pre>
<p>Natürlich will ich als Entwickler mir nicht in die Karten schauen lassen, deswegen ist mGeheimerText auch private.<br />
Der Benutzer der Library könnte aber doch jederzeit den Header bearbeiten und seine Funktionen und Klassen als Freunde reinschreiben und somit auf meine privaten Daten zugreifen.</p>
<p>Man könnte das natürlich so mit einer forward declaration umgehen:</p>
<pre><code class="language-cpp">class GeheimeDatenKlasse;

class CFoo
{
public:
    //bla
protected:
    //bla
private:
    GeheimeDatenKlasse mGeheim;
};
</code></pre>
<p>Die Schnittstelle für GeheimeDatenKlasse hat der User natürlich nicht aber ich finde diese Lösung sehr unelegant.<br />
Gibts da nicht was schlaueres oder steh ich im Moment auf dem Schlauch?</p>
<p>Grüße<br />
FellaR</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/193678/datenkapselung-und-friend</link><generator>RSS for Node</generator><lastBuildDate>Mon, 28 Sep 2026 05:13:53 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/193678.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 28 Sep 2007 14:38:58 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 14:40:09 GMT]]></title><description><![CDATA[<p>Hey,</p>
<p>mal eine eher grundsätzliche Frage:<br />
C++ erlaubt es ja, mit dem friend-Keyword auf private elemente einer Klasse zuzugreifen.<br />
Angenommen ich schreibe eine Library 'libFoo' für irgendwas und jemand bindet diese Library in sein Programm ein und inkludiert dazu den Header 'libFoo.h', wo die Klassendeklaration drin ist:</p>
<pre><code class="language-cpp">class CFoo
{
public:
    //bla
protected:
    //bla
private:
    string mGeheimerText;
};
</code></pre>
<p>Natürlich will ich als Entwickler mir nicht in die Karten schauen lassen, deswegen ist mGeheimerText auch private.<br />
Der Benutzer der Library könnte aber doch jederzeit den Header bearbeiten und seine Funktionen und Klassen als Freunde reinschreiben und somit auf meine privaten Daten zugreifen.</p>
<p>Man könnte das natürlich so mit einer forward declaration umgehen:</p>
<pre><code class="language-cpp">class GeheimeDatenKlasse;

class CFoo
{
public:
    //bla
protected:
    //bla
private:
    GeheimeDatenKlasse mGeheim;
};
</code></pre>
<p>Die Schnittstelle für GeheimeDatenKlasse hat der User natürlich nicht aber ich finde diese Lösung sehr unelegant.<br />
Gibts da nicht was schlaueres oder steh ich im Moment auf dem Schlauch?</p>
<p>Grüße<br />
FellaR</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374443</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374443</guid><dc:creator><![CDATA[Fellar]]></dc:creator><pubDate>Fri, 28 Sep 2007 14:40:09 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 16:52:07 GMT]]></title><description><![CDATA[<p>jepp das könnte er:) aber was bringt ihm?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374535</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374535</guid><dc:creator><![CDATA[BorisDieKlinge]]></dc:creator><pubDate>Fri, 28 Sep 2007 16:52:07 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 17:29:12 GMT]]></title><description><![CDATA[<p>Der User verfügt ja nicht über die Deklaration (und Definition) von GeheimeDatenKlasse, also kann er auch nicht wissen, was darin zu finden ist, geschweige denn auf die Daten darin zugreifen.<br />
Oder sehe ich was falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374561</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374561</guid><dc:creator><![CDATA[Fellar]]></dc:creator><pubDate>Fri, 28 Sep 2007 17:29:12 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 21:30:47 GMT]]></title><description><![CDATA[<p>Du kannst keine vorwärts deklarierten Objekte definieren, darum geht dein Code auch nicht. Mit ein paar Tricks geht es dennoch. Suche mal nach Pimpl- oder Handle-Body-Idiom.</p>
<p>Wenn jemand wirklich Zugriff auf die Innereien einer Klasse will so kommt er immer per Casts ran. Nur eben kriegt er Probleme falls du sie änderst.</p>
<p>Das Ziel von Zugriffsrechten ist es nicht das Hacken unmöglich zu machen sondern versehentliche Fehler zu finden. Solange man die Kettensäge zuhause lässt findet der Compiler alles was Probleme mit der Kapslung machen könnte.</p>
<p>Das Ziel der Kapselung ist es bei der Organisation eines Programms zu helfen, nicht vor Raub zu schützen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374665</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374665</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Fri, 28 Sep 2007 21:30:47 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 21:31:32 GMT]]></title><description><![CDATA[<p>deshalb sollte man auch lieber von sichtbarkeit und nicht &quot;zugriffsrecht&quot; sprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374667</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374667</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 28 Sep 2007 21:31:32 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 21:42:41 GMT]]></title><description><![CDATA[<p>thordk schrieb:</p>
<blockquote>
<p>deshalb sollte man auch lieber von sichtbarkeit und nicht &quot;zugriffsrecht&quot; sprechen.</p>
</blockquote>
<p>Sichtbarkeit ist auch nicht gut, weil private Daten sind sichtbar! Zu mindest können sie andere Daten verdecken. Zum Beispiel:</p>
<pre><code class="language-cpp">struct Foo{
	int foo;
};

class Bar:public Foo{
private:
	int foo; 
};

int main(){
	Bar bar;
	bar.foo = 4; // Bum
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1374672</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374672</guid><dc:creator><![CDATA[Ben04]]></dc:creator><pubDate>Fri, 28 Sep 2007 21:42:41 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 21:52:13 GMT]]></title><description><![CDATA[<p>public und privat sind nicht zur Sicherheit gemacht, die wurden zur Strukturierung und Fehlervermeidung erfunden. Binär ist es dann egal, ob es irgendwann man public oder private war. Warum sollte man es denn einem Frenden absolut unmöglich machen, die Privaten daten zu verendern? Es steht privat davor, also weis er, dass es ihn nichts angeht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374675</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374675</guid><dc:creator><![CDATA[Krux]]></dc:creator><pubDate>Fri, 28 Sep 2007 21:52:13 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Fri, 28 Sep 2007 22:36:18 GMT]]></title><description><![CDATA[<p>Ben04 schrieb:</p>
<blockquote>
<p>thordk schrieb:</p>
<blockquote>
<p>deshalb sollte man auch lieber von sichtbarkeit und nicht &quot;zugriffsrecht&quot; sprechen.</p>
</blockquote>
<p>Sichtbarkeit ist auch nicht gut, weil private Daten sind sichtbar! Zu mindest können sie andere Daten verdecken. Zum Beispiel:</p>
<pre><code class="language-cpp">struct Foo{
	int foo;
};

class Bar:public Foo{
private:
	int foo; 
};

int main(){
	Bar bar;
	bar.foo = 4; // Bum
}
</code></pre>
</blockquote>
<p>wieso sollte der private member dadurch sichtbar werden? wenn du über ein Bar objekt zugreifst, sagst du ganz eindeutig, dass du an den member foo von bar heranwillst und nicht den von foo. und der ist private und somit nicht sichtbar. um den von foo zu erreichen, müsstest du den zugriff qualifizieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1374681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374681</guid><dc:creator><![CDATA[thordk]]></dc:creator><pubDate>Fri, 28 Sep 2007 22:36:18 GMT</pubDate></item><item><title><![CDATA[Reply to Datenkapselung und &#x27;friend&#x27; on Sat, 29 Sep 2007 02:41:35 GMT]]></title><description><![CDATA[<p>Das Wort &quot;sichtbar&quot; ist hier IMO nicht angebracht, natürlich ist er &quot;sichtbar&quot;. Der Zugriff ist bloss nicht erlaubt. Was soll daran &quot;unsichtbar&quot; sein? Wenn &quot;Bar::foo&quot; unsichtbar wäre, dann würde ich erwarten dass das Beispiel compiliert, was es nicht tut, da &quot;Bar::foo&quot; eben &quot;sichtbar&quot; ist, daher ausgewählt wird, der Zugriff aber nicht erlaubt ist, und daher der Compiler richtigerweise schreit.</p>
<p>BTW:</p>
<pre><code class="language-cpp">bar.Foo::foo = 4; // so geht's
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/641">@Fellar</a>:<br />
Deine Überlegungen sind typisch für Leute die mit C++ anfangen, ich hab mir das selbst vor Jahren auch mal überlegt. Letztendlich ist es aber vollkommen egal was wer wo machen könnte wenn er deine Header Files editiert. Wenn er das macht ist ER dafür verantwortlich wenn was nicht funktioniert.</p>
<p>Wenn du Informationen/Daten/Funktionen/... wirklich *verstecken* willst musst du deine Klassen &quot;pimpln&quot; (pimpl pattern), und die Library/DLL dann vorkompiliert mit nur .lib/.dll/.h Files ausliefern.<br />
Natürlich ist selbst das kein 100%iger Schutz, da man alles irgendwie disassembliert bekommt.</p>
<p>Im Allgemeinen sollte man sich darüber aber einfach keinen Kopf machen, und Dinge so programmieren wie sie Sinn machen, und sich nicht weiter den Kopf darüber zerbrechen was wer wo machen könnte wenn er die Header Files editiert.</p>
<blockquote>
<p>Natürlich will ich als Entwickler mir nicht in die Karten schauen lassen, deswegen ist mGeheimerText auch private</p>
</blockquote>
<p>Je mehr man von fremdem Code mit dem man arbeiten muss (andere Module, LIBs, DLLs etc.) sehen kann, je einfacher deiser zu durschauen ist, desto besser für alle. Z.B. schonmal deswegen weil fast nichts jemals fehlerfrei ist, und auch fast nichts jemals so gut dokumentiert ist dass keine Fragen auftreten. Je mehr man &quot;in die Karten schauen&quot; kann, desto schneller wird man seine Fragen beantwortet finden oder ggf. Fehler in dem fremden Code auffinden. Beantwortete Fragen sind gut, und gefundene Fehler kann man reparieren -&gt; alle sind glücklich <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/1374708</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1374708</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 29 Sep 2007 02:41:35 GMT</pubDate></item></channel></rss>