<?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[Freund erbt von privater nested class -&amp;gt; geht nicht]]></title><description><![CDATA[<pre><code class="language-cpp">namespace x
{
  class FooBar;  //forward-declaration

  class Foo
  {
  private:
    class Bar {};

   friend class ::x::FooBar;
  };

  class FooBar
  :private Foo::Bar 
  {
  };
}
</code></pre>
<p>Ich bekomme einen Fehler, dass Foobar nicht auf Foo::Bar zugreifen kann (von Comeau und VC 8.0; VC 7.1 hat das geschluckt). Aber warum bekomm ich den Fehler?</p>
<p>FooBar ist doch ein Freund von Foo?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/146989/freund-erbt-von-privater-nested-class-gt-geht-nicht</link><generator>RSS for Node</generator><lastBuildDate>Fri, 04 Sep 2026 03:51:31 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/146989.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 May 2006 16:15:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 16:22:54 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">namespace x
{
  class FooBar;  //forward-declaration

  class Foo
  {
  private:
    class Bar {};

   friend class ::x::FooBar;
  };

  class FooBar
  :private Foo::Bar 
  {
  };
}
</code></pre>
<p>Ich bekomme einen Fehler, dass Foobar nicht auf Foo::Bar zugreifen kann (von Comeau und VC 8.0; VC 7.1 hat das geschluckt). Aber warum bekomm ich den Fehler?</p>
<p>FooBar ist doch ein Freund von Foo?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056624</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056624</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 12 May 2006 16:22:54 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 16:43:35 GMT]]></title><description><![CDATA[<p>weil du versuchst von einer privaten klasse (Bar) zu erben ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056639</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056639</guid><dc:creator><![CDATA[Cpt. Tanga]]></dc:creator><pubDate>Fri, 12 May 2006 16:43:35 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 16:52:40 GMT]]></title><description><![CDATA[<p>Ich weiß was ich tue, versteh aber nicht warum es nicht geht. Schließlich ist FooBar in Foo als friend declariert und sollte damit zugriff auf die privaten Element von Foo haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056646</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056646</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 12 May 2006 16:52:40 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 17:05:02 GMT]]></title><description><![CDATA[<p>Ich kann (fast) denselben Effekt - den ich unter VC7.1 hatte - folgendermaßen nachbauen:</p>
<pre><code class="language-cpp">namespace x
{
  class FooBar;  //forward-declaration

  class Foo
  {
  public:
    class Bar 
    {
    private:
      ~Bar();
      friend class ::x::FooBar;
    };
  };

  class FooBar
  :private Foo::Bar   
  {
  };

  class FooBarEnemy
  :private Foo::Bar        //geht leider jetzt auch
  {
  };

  FooBar fooBar;
  FooBarEnemy fooBarEnemy; //das bringt den gewollten Fehler
}
</code></pre>
<p>Leider kriegt man den erwünschten Compilerfehler bei unerlaubter Vererbung dann aber erst, wenn man von FooBarEnemy eine Instanz anlegt.<br />
Wenn der Feind also nur statische Methoden hat, kann er geerbte statische Methoden verwenden. <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="😞"
    /> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1056655</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056655</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 12 May 2006 17:05:02 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 17:16:43 GMT]]></title><description><![CDATA[<p>weil FooBarEnemy nicht ~Bar() aufrufen kann da privat (nur vermutung)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056661</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056661</guid><dc:creator><![CDATA[Cpt. Tanga]]></dc:creator><pubDate>Fri, 12 May 2006 17:16:43 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Fri, 12 May 2006 17:35:43 GMT]]></title><description><![CDATA[<p>Deine Vermutung ist schon richtig.</p>
<p>Mich interessiert aber vielmehr die Frage:</p>
<p>Wie kann ich sicherstellen, dass nur eine bestimmte Klasse B von einer Klasse Klasse A ableiten kann?</p>
<p>Das hatte ich unter VC7.1 mit den privaten nested-Classes so, nur scheint das weder in VC++ 8 zu funktionieren noch Standard zu sein (verlass mich mal auf Comeau).</p>
<p>Das mit dem privaten Ctor gefällt mir nicht, da ich damit nicht verhinder kann, dass X ableitet sondern nur, dass X instanziiert wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056674</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056674</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Fri, 12 May 2006 17:35:43 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Sat, 13 May 2006 09:04:01 GMT]]></title><description><![CDATA[<p>kartoffelsack schrieb:</p>
<blockquote>
<p>Ich bekomme einen Fehler, dass Foobar nicht auf Foo::Bar zugreifen kann (von Comeau und VC 8.0; VC 7.1 hat das geschluckt). Aber warum bekomm ich den Fehler?</p>
</blockquote>
<p>Weil der Name Foo::Bar im globalen Scope nicht sichtbar ist und genau dort referenzierst du ihn.</p>
<p>Die privaten Elemente einer Klasse sind außerhalb einer Klasse nicht sichtbar, können also nicht per Name angesprochen werden. Ausnahme: Entitäten die als Freund deklariert wurden. Solche sehen die privaten Namen.</p>
<p>In deinem Fall hast du die Klasse FooBar als Freund der Klasse Foo deklariert. Im Scope von FooBar kannst du also alle privaten Elemente von Foo sehen. Die Basisklassenliste einer Klasse gehört nun aber nicht zum Scope der Klasse. Aus diesem Grund kannst du in der Basisklassenliste von FooBar auch nicht auf die privaten Elemente von Foo zugreifen. Dies geht erst innerhalb der Klassendefinition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1056914</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1056914</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Sat, 13 May 2006 09:04:01 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Sun, 14 May 2006 13:03:06 GMT]]></title><description><![CDATA[<p>Gibts ne Möglichkeit mein Ziel anders zu erreichen?</p>
<p>Ich will beim Entwurf von Bar festlegen, wer ableiten darf?</p>
<p>(Eigentlich will ich das Projekt von VC7.1 auf 8.0 umstellen, ohne etwas an der Struktur zu ändern. Ich könnte Bar auch einfach public machen, dann würde das Programm wieder übersetzen. Dann ist das ganze Code-Konstrukt aber völlig sinnlos.)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1057547</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1057547</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Sun, 14 May 2006 13:03:06 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Mon, 15 May 2006 08:35:06 GMT]]></title><description><![CDATA[<p>kartoffelsack schrieb:</p>
<blockquote>
<p>Gibts ne Möglichkeit mein Ziel anders zu erreichen?</p>
</blockquote>
<p>Eine wasserfeste fällt mir im Moment nicht ein. Alle Template-Lösungen die mir einfallen würden nicht gegen mutwillges Missverhalten schützen.</p>
<blockquote>
<p>Ich will beim Entwurf von Bar festlegen, wer ableiten darf?</p>
</blockquote>
<p>Da stellt sich für mich erstmal die Frage: Warum? Wenn man die genaue Motivation kennt, kann man vielleicht auch einen Workaround finden. Wenn Bars Quellcode bekannt ist und nur z.B. der Code von Bar nicht allgemein genug ist (viele Annahmen, wenig Tests...), dann sollte es doch reichen, wenn Bar seine Freunde benennt. Zusammen mit einem privaten Destruktor hat man dann eine kontrollierte Instanziierbarkeit. Machst du auch Bars statische Member alle private kann ein Non-Friend auch nicht durch &quot;böswilliges&quot; Erben darauf zugreifen.</p>
<p>Letztlich stellt sich imo aber die Frage, ob du fremden Code wirklich als &quot;Feind&quot; betrachten musst. Die Kapselmechanismen sind ja eigentlich nicht als Schutz vor gewolltem Missverhalten gedachten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1057930</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1057930</guid><dc:creator><![CDATA[HumeSikkins]]></dc:creator><pubDate>Mon, 15 May 2006 08:35:06 GMT</pubDate></item><item><title><![CDATA[Reply to Freund erbt von privater nested class -&amp;gt; geht nicht on Mon, 15 May 2006 13:45:14 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">Da stellt sich für mich erstmal die Frage: Warum?
</code></pre>
<p>Die Motivation bei erstellen des Codes war eine kompakte Core-Klasse mit schlanker Schnittstelle zu haben, die aber nicht direkt angesprochen wird, sondern über eine zweite Schnittstellenklasse, die ein relativ reiches Interface zur Verfügung stellt.</p>
<p>Das sorgt zum einen Dafür die eigentliche Klasse schlang zu halten - mit allen Vorteilen - eine konfortable benutzung aber über eine Klasse mit Member-Funktionen statt non-friend-non-Member-Klassen zu ermöglichen.</p>
<p>Das ganze hat aber den Nachteil, dass man ziehmlich viel redundanden Code bekommt mit Funktionen, die die Aufrufe 1 zu 1 an andere Funktionen weiterleiten.</p>
<p>Ich will dieses Design an dieser Stelle aber auch garnicht in Frage stellen oder gut heißen, ich will erstmal nen Port auf das neue VC ohne größeren Umbauten machen. Wenn das läuft kann man weiterdenken. Ich fürchte aber, dass ich jetzt erst weiterdenken und Umbauen muss und dann erst den Port machen kann <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="🙄"
    /> Das stellt das Vorhaben des Ports infrage (bzw. verschiebt es, bis nach meinem Ausscheiden aus meiner jetzigen Firma in ein paar Wochen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /> )</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1058150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1058150</guid><dc:creator><![CDATA[kartoffelsack]]></dc:creator><pubDate>Mon, 15 May 2006 13:45:14 GMT</pubDate></item></channel></rss>