<?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[static im globalen Namespace bzw. außerhalb von Klassen &amp;amp; Sinn von friend?]]></title><description><![CDATA[<p>Sers COM,</p>
<p><strong>1.) static außerhalb von class:</strong><br />
Was für einen Sinn hat bzw. wie funktioniert eine static-deklarierte Funktion außerhalb einer Klasse? Bsp.:</p>
<pre><code>static void Func1(void)
{
}

int main()
{
  return 0;
}
</code></pre>
<p>Deklariere ich static-Funktionen oder static-Variablen innerhalb von Klassen erwirkt man ja damit, dass diese statischen Elemente (Variablen, Konstanten oder Funktionen) pro Klasse nur einmal existieren und nicht, wie ihre Member-Pendants, einmal pro Instanz.<br />
Da ist ja die Zugehörigkeit klar, also zur Klasse.<br />
Wenn ich aber nun wie im Beispiel einfach nur eine static-Funktion außerhalb der main()-Funktion, also im globalen Namespace oder meinetwegen auch in irgendeinen Namespace deklariere, zu was ist diese dann zugehörig und hätte das überhaupt einen Nutzen, einen Anwendungsfall? Übersetzen lässt es sich ja, ich frage mich gerade nur, ob das überhaupt was bringt und ob sich daran gegenüber normaler Nicht-static-Unterprogramme hinsichtlich der Semantik etwas ändert?</p>
<p><strong>2.) static vs. extern:</strong><br />
Bzgl. des Zweckes. Gibt es einen entscheidenen Unterschied zwischen dem static- und extern-Spezifizierer?<br />
Wann genau ist welcher zu bevorzugen?</p>
<p><strong>3.) friend:</strong><br />
Kann mich mal einer zum friend-Spezifizierer aufklären?<br />
Ich meine, ich sehe dahinter keinen Sinn, hebt dieser doch das Prinzip der Kapselung wieder auf?! Wozu gibt es diesen und kann mir mal jemand ein einfaches Beispiel zeigen, wo es Sinn macht, diesen einzusetzen? Die Beschreibungen und Beispiele im Netz und Büchern sind für mich mehr schlecht als recht.</p>
<p>Ich danke vielmals im Voraus!</p>
<p>MfG</p>
<p>Schlitzauge <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/314219/static-im-globalen-namespace-bzw-außerhalb-von-klassen-amp-sinn-von-friend</link><generator>RSS for Node</generator><lastBuildDate>Sat, 01 Aug 2026 12:43:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/314219.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 24 Feb 2013 01:12:12 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to static im globalen Namespace bzw. außerhalb von Klassen &amp;amp; Sinn von friend? on Sun, 24 Feb 2013 01:13:43 GMT]]></title><description><![CDATA[<p>Sers COM,</p>
<p><strong>1.) static außerhalb von class:</strong><br />
Was für einen Sinn hat bzw. wie funktioniert eine static-deklarierte Funktion außerhalb einer Klasse? Bsp.:</p>
<pre><code>static void Func1(void)
{
}

int main()
{
  return 0;
}
</code></pre>
<p>Deklariere ich static-Funktionen oder static-Variablen innerhalb von Klassen erwirkt man ja damit, dass diese statischen Elemente (Variablen, Konstanten oder Funktionen) pro Klasse nur einmal existieren und nicht, wie ihre Member-Pendants, einmal pro Instanz.<br />
Da ist ja die Zugehörigkeit klar, also zur Klasse.<br />
Wenn ich aber nun wie im Beispiel einfach nur eine static-Funktion außerhalb der main()-Funktion, also im globalen Namespace oder meinetwegen auch in irgendeinen Namespace deklariere, zu was ist diese dann zugehörig und hätte das überhaupt einen Nutzen, einen Anwendungsfall? Übersetzen lässt es sich ja, ich frage mich gerade nur, ob das überhaupt was bringt und ob sich daran gegenüber normaler Nicht-static-Unterprogramme hinsichtlich der Semantik etwas ändert?</p>
<p><strong>2.) static vs. extern:</strong><br />
Bzgl. des Zweckes. Gibt es einen entscheidenen Unterschied zwischen dem static- und extern-Spezifizierer?<br />
Wann genau ist welcher zu bevorzugen?</p>
<p><strong>3.) friend:</strong><br />
Kann mich mal einer zum friend-Spezifizierer aufklären?<br />
Ich meine, ich sehe dahinter keinen Sinn, hebt dieser doch das Prinzip der Kapselung wieder auf?! Wozu gibt es diesen und kann mir mal jemand ein einfaches Beispiel zeigen, wo es Sinn macht, diesen einzusetzen? Die Beschreibungen und Beispiele im Netz und Büchern sind für mich mehr schlecht als recht.</p>
<p>Ich danke vielmals im Voraus!</p>
<p>MfG</p>
<p>Schlitzauge <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/2301509</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301509</guid><dc:creator><![CDATA[Schlitzauge]]></dc:creator><pubDate>Sun, 24 Feb 2013 01:13:43 GMT</pubDate></item><item><title><![CDATA[Reply to static im globalen Namespace bzw. außerhalb von Klassen &amp;amp; Sinn von friend? on Sun, 24 Feb 2013 02:26:02 GMT]]></title><description><![CDATA[<p>Schlitzauge schrieb:</p>
<blockquote>
<p>Sers COM,<br />
<strong>1.) static außerhalb von class:</strong><br />
Was für einen Sinn hat bzw. wie funktioniert eine static-deklarierte Funktion außerhalb einer Klasse? Bsp.:<br />
[code=&quot;cpp&quot;]static void Func1(void)<br />
{<br />
}</p>
</blockquote>
<p>Als private Hilfsfunktion für eine globale foo() in der foo.hpp nebst foo.cpp.<br />
Zum Beispiel würden in meiner malloc.hpp nur malloc/free stehen. Die malloc.hpp sie würde selber keine includes brauchen, außer einer Datei, die size_t besorgt. Und die malloc.cpp würde ballig mehr inkludieren und die malloc() worde die static growHeap() benutzen und eds gäbe auch globale Variablen und beliebige Freiheit. Nur müßte der Linker das halt nicht sehen.</p>
<p>Abgesehen davon, daß statt static besser namespace{</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301523</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301523</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Feb 2013 02:26:02 GMT</pubDate></item><item><title><![CDATA[Reply to static im globalen Namespace bzw. außerhalb von Klassen &amp;amp; Sinn von friend? on Sun, 24 Feb 2013 02:31:36 GMT]]></title><description><![CDATA[<p>Schlitzauge schrieb:</p>
<blockquote>
<p><strong>2.) static vs. extern:</strong><br />
Bzgl. des Zweckes. Gibt es einen entscheidenen Unterschied zwischen dem static- und extern-Spezifizierer?<br />
Wann genau ist welcher zu bevorzugen?</p>
</blockquote>
<p>Sie machen eher das Gegenteil. Da ist keiner zu bevorzugen, sie arbeiten Hand-in-Hand.</p>
<p>Schlitzauge schrieb:</p>
<blockquote>
<p><strong>3.) friend:</strong><br />
Kann mich mal einer zum friend-Spezifizierer aufklären?<br />
Ich meine, ich sehe dahinter keinen Sinn, hebt dieser doch das Prinzip der Kapselung wieder auf?! Wozu gibt es diesen und kann mir mal jemand ein einfaches Beispiel zeigen, wo es Sinn macht, diesen einzusetzen? Die Beschreibungen und Beispiele im Netz und Büchern sind für mich mehr schlecht als recht.</p>
</blockquote>
<p>friend benutzt man, wenn etwas &quot;eigentlich&quot; eine Methode sein müßte, aber als Methode nicht klappt. Hauptbeispiel der operator&lt;&lt;.</p>
<pre><code>ostream&amp; operator&lt;&lt;(ostream&amp; o,Bruchzahl cons6&amp; b){
   o&lt;&lt;b.zähler;
   if(b.nenner!=1){
      o&lt;&lt;'/';
      o&lt;&lt;b.nenner;
   }
   return o;
}
</code></pre>
<p>Weil Burchzahl nenner und zähler privat hat, kann der op&lt;&lt; zum friend werden, um genau ihm und keinem anderen Zugriff darauf zu geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301524</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301524</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sun, 24 Feb 2013 02:31:36 GMT</pubDate></item><item><title><![CDATA[Reply to static im globalen Namespace bzw. außerhalb von Klassen &amp;amp; Sinn von friend? on Sun, 24 Feb 2013 04:28:18 GMT]]></title><description><![CDATA[<p>Schlitzauge schrieb:</p>
<blockquote>
<p><strong>3.) friend:</strong><br />
Kann mich mal einer zum friend-Spezifizierer aufklären?<br />
Ich meine, ich sehe dahinter keinen Sinn, hebt dieser doch das Prinzip der Kapselung wieder auf?! Wozu gibt es diesen und kann mir mal jemand ein einfaches Beispiel zeigen, wo es Sinn macht, diesen einzusetzen? Die Beschreibungen und Beispiele im Netz und Büchern sind für mich mehr schlecht als recht.</p>
</blockquote>
<p><code>friend</code> ist eine Sache die man nicht oft braucht, aber wenn man es braucht, dann kann man damit die Kapselung verbessern, nicht aufbrechen.<br />
<code>friend</code> schreibst du in die Klasse die Zugriff gewährt, jede Klasse kann also selbst entscheiden wer &quot;darf&quot; und wer &quot;nicht darf&quot;.<br />
Sogesehen wird also nichts aufgeweicht, denn wenn ich eine Klasse modifizieren kann, dann kann ich genau so gut gleich alle <code>private:</code> in <code>public:</code> umschreiben -- <code>friend</code> bringt hier also keine Verschlechterung.</p>
<p>Nur nebenbei: andere Sprachen bieten ähnliche Konstrukte an um das selbe zu erreichen, z.B. <code>internal</code> (C#) oder &quot;package access&quot; (Java). Der Unterschied dabei ist dass man mit <code>internal</code> bzw. &quot;package access&quot; genauer kontrollieren kann auf was zugegriffen werden darf, dafür weniger genau wer zugreifen darf.</p>
<p>OK, zurück zu &quot;was soll das ganze?&quot;.</p>
<p>Beispiel: intrusive Datenstrukturen. Eine intrusive Map muss entweder Zugriff auf die im zu mappenden Element gespeicherte MapNode haben, oder die MapNode muss Zugriff auf die Map haben. Mit <code>friend</code> ganz einfach: die MapNode sagt <code>friend Map</code> und die Sache ist gegessen. Ohne <code>friend</code> muss man rumbasteln.</p>
<p>Etwas allgemeiner: wenn du zwei Klassen hast die eng zusammenarbeiten, für den User aber eben getrennte Klassen sein sollen, dann kann <code>friend</code> was bringen. Z.B. indem es dir ermöglicht ohne unnötigen Weiterleitungsfunktionen oder sonstige üble Tricks den Code einfach dort hinzuschreiben wo er hingehört.</p>
<p>Ein Beispiel dazu: Ein Renderer rendert, also gehört der Render-Code auch in den Renderer. Jetzt möchte der Renderer aber gerne auf Innereien einiger Renderables zugreifen -- z.B. weil er da drinnen irgendwelche Dinge cachen möchte. Vielleicht Texturen oder Shader oder Verwaltungsdaten für vom Renderer verwaltete Vertex-Buffer.<br />
Also sagen die von der Library vordefinierten Renderables einfach <code>friend Renderer</code> , und er kann.<br />
Ohne <code>friend</code> muss man auch hier entweder rumfrickeln, oder irgendwelche Implementierungsdetails allgemein zugänglich machen.</p>
<p>----</p>
<p>Nochwas: falls du das PIMPL Idiom kennst, dann denk man drüber nach was PIMPL und <code>friend</code> gemeinsam haben. Nämlich ziemlich viel wenn du mich fragst <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="🙂"
    /><br />
(Und falls du es nicht kennt, dann schlag es nach.)<br />
<code>friend</code> ermöglicht im Prinzip &quot;PIMPL ohne Zeiger&quot; <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="🤡"
    /> . Dafür mit Inlining. Man könnte fast sagen: <code>friend</code> ist das bessere PIMPL.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2301532</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2301532</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sun, 24 Feb 2013 04:28:18 GMT</pubDate></item></channel></rss>