<?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[Komplizierte Frage zu Vererbung und Zugriff]]></title><description><![CDATA[<p>Moin!</p>
<p>Habe eine Frage zu folgendem Konstrukt:</p>
<pre><code class="language-cpp">class A {
 protected:
 FILE* fp;
};

class B : public A {
  public:
  friend class C; // OHNE DIESE ZEILE GEHT UNTEN DAS ERSTE fread() NICHT!
  class B_Entry {
  public:
  virtual void read(B* b_class) = 0;
  //...
  };
};

class C : public B {
 public:
 class C_Entry : public B::B_Entry {
  public:
  void read(B* b_class);
  //..
 };
};
</code></pre>
<p>Das Prob liegt in der Implementation:</p>
<pre><code class="language-cpp">void C::C_Entry::read(B* b_class)
{
 //...
 fread(/*...*/ , b_class-&gt;fp); // geht nicht, compiler-error!
 fread(/*...*/ , ((C*)b_class)-&gt;fp); // geht komischerweise
}
</code></pre>
<p>Der Kompiler sagt bei der ersten fread()-Zeile:</p>
<pre><code>error: ‘FILE* A::fp’ is protected
</code></pre>
<p>Muss ich das verstehen? <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="😉"
    /><br />
Bitte um Hilfe!</p>
<p>Mfg,<br />
voidpointer</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216248/komplizierte-frage-zu-vererbung-und-zugriff</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 11:51:40 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216248.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Jun 2008 12:31:26 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Sat, 21 Jun 2008 14:43:12 GMT]]></title><description><![CDATA[<p>Moin!</p>
<p>Habe eine Frage zu folgendem Konstrukt:</p>
<pre><code class="language-cpp">class A {
 protected:
 FILE* fp;
};

class B : public A {
  public:
  friend class C; // OHNE DIESE ZEILE GEHT UNTEN DAS ERSTE fread() NICHT!
  class B_Entry {
  public:
  virtual void read(B* b_class) = 0;
  //...
  };
};

class C : public B {
 public:
 class C_Entry : public B::B_Entry {
  public:
  void read(B* b_class);
  //..
 };
};
</code></pre>
<p>Das Prob liegt in der Implementation:</p>
<pre><code class="language-cpp">void C::C_Entry::read(B* b_class)
{
 //...
 fread(/*...*/ , b_class-&gt;fp); // geht nicht, compiler-error!
 fread(/*...*/ , ((C*)b_class)-&gt;fp); // geht komischerweise
}
</code></pre>
<p>Der Kompiler sagt bei der ersten fread()-Zeile:</p>
<pre><code>error: ‘FILE* A::fp’ is protected
</code></pre>
<p>Muss ich das verstehen? <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="😉"
    /><br />
Bitte um Hilfe!</p>
<p>Mfg,<br />
voidpointer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533231</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533231</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sat, 21 Jun 2008 14:43:12 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Sat, 21 Jun 2008 12:51:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class B_Entry { 
  virtual void read(B* b_class) = 0;
</code></pre>
<p>public vergessen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533237</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533237</guid><dc:creator><![CDATA[unskilled]]></dc:creator><pubDate>Sat, 21 Jun 2008 12:51:20 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Sat, 21 Jun 2008 12:55:56 GMT]]></title><description><![CDATA[<p>oh sry, ist natürlich public, hatte mich im forum verschrieben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533240</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533240</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sat, 21 Jun 2008 12:55:56 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Sat, 21 Jun 2008 14:41:01 GMT]]></title><description><![CDATA[<p>OK habe die friend Deklaration (oben mit Kommentar markiert) hinzugefügt, dann geht es. Aber was hat das mit einer Freundschaft zwischen B und C zu tun, wenn ich doch auf ein Element von A (A::fp) zugreifen möchte?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533267</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533267</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Sat, 21 Jun 2008 14:41:01 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Sat, 21 Jun 2008 17:26:38 GMT]]></title><description><![CDATA[<p>protected existiert nicht, damit sich eine Klasse auf Umwegen zum friend erklären kann (indem sie einfach ableitet) - Freundschaft wird gewährt nicht gefordert. protected dient dazu, einem Objekt Zugriff auf ihre eigene Implementation, die z.T. in einer Basisklasse erfolgt ist, zu gewähren. Folglich ist bei nicht-statischen protected-Membern immer ein Objekt eigenen Klasse erforderlich.<br />
Angenommen, das wäre anders, betrachte:</p>
<pre><code class="language-cpp">class D : public B { /* ... */ };
C::C_Entry c;
D d;
c.read(&amp;d); // ups
</code></pre>
<p>Generell sind protected Datenmember problematisch und ein Bugmagnet. Vermeide sie.</p>
<p>Edit: auch mit der friend-Deklaration wie oben beschrieben darf es nicht funktionieren (das ist also ein Compiler-bug). Freundschaft ist nicht transitiv, ein Member einer verschachtelten Klasse, kann nicht auf protected oder private Member einer Klasse zu greifen, die der umliegenden Klasse Freundschaft gewährt.<br />
Da Member einer verschachtelten Klasse keine besonderen Zugriffsprivilegien bzgl. der umschließenden Klasse haben (wird nicht von jedem Compiler beachtet), darf im Übrigen auch die zweite Form mit dem Cast nicht funktionieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533298</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533298</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 21 Jun 2008 17:26:38 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 19:41:53 GMT]]></title><description><![CDATA[<p>OK, das hieße, dass du mir von protected abrätst und dass ich also alles mit friend-Deklarationen lösen müsste? Das Problem ist, dass ich in diesem Fall mehrere C-Klassen habe, und dann müsste ja A C1, C2, C3 ... und deren Subklassen (C1::Entry ... ) alle zu Freunden machen? Das wäre ja ein riesen Aufwand... gibt es keine sinnvollen Alternativen?</p>
<p>Greetz</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534399</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534399</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Mon, 23 Jun 2008 19:41:53 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 19:47:13 GMT]]></title><description><![CDATA[<p>Ich schlage nichts vor, weil der Zweck wegen der Bezeichner unklar bleibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534409</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534409</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Jun 2008 19:47:13 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 19:59:10 GMT]]></title><description><![CDATA[<p>Der Zweck ist, dass A praktisch eine Datei repräsentiert, B eine generelle Datei, die man zum als Verpackungsdatei nutzen kann (ZIP, TAR, ...) - also pure virtuell. C1, C2 etc. repräsentieren Klassen für die einzlnen Verpackungsdateiarten, z.B. ein Tar-File. Dabei ist C1::Entry ein Header, wie er in dann z.B. in einer Tar-Datei ist (Name der verpackten Datei, verpackte Länge, Rechte etc.)...</p>
<p>Nun Sollen also die Entries in C1, C2... (ZIP, TAR) etc. von einem pure virtuellen B:Entry erben. Aber in der C::read()-Funktion gibt es, wie oben geschrieben, eben diese Probleme.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534423</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534423</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Mon, 23 Jun 2008 19:59:10 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 20:11:54 GMT]]></title><description><![CDATA[<p>Es würde genügen, wenn B_Entry friend von B ist und ein (protected) Interface zur Verfügung stellt, über das auf die Innereien von B definiert zugegriffen werden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534431</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534431</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Jun 2008 20:11:54 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 20:36:17 GMT]]></title><description><![CDATA[<p>Hallo</p>
<p>Also falls du mich hypothetisch fragen würdest was ich von dem Ganzen Konstrukt halte, würde ich meinen das Du das Thema verfehlt hast.<br />
!Alles das was camper in seinem &quot;protected existiert nicht&quot; post gemeint hat!<br />
Friends sind eigentlich vermeidbar.<br />
protected data types bringen schlechtes karma.<br />
geschachtelte Klassen finden niemals ihre Anerkennung. (ausser sie wollen es nicht =&gt; z.b. aggregation)</p>
<p>Schau mal ob dir unter Umständen Templates bei deinem Problem helfen können. Ich kenne jedoch dein Problem zu wenig um da eine genaue Aussage treffen zu können.</p>
<p>Aber mein Tip: C++ ist nicht immer gleich OOP. Löse erstmal dein eigentliches Problem. Es geht hier ja wahrscheinlich um sowas wie Datenkompression. Dann fasse zusammen.</p>
<p>WX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534448</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534448</guid><dc:creator><![CDATA[WeaponX2007]]></dc:creator><pubDate>Mon, 23 Jun 2008 20:36:17 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 20:43:22 GMT]]></title><description><![CDATA[<p>mit Interface meinst du, dass ich z.B. dem Entry im Konstruktor einen Pointer auf B (generelle Verpackungsdatei) übergeben könnte, den es dann in einer protected-variable einspeichert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534453</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Mon, 23 Jun 2008 20:43:22 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Mon, 23 Jun 2008 22:37:11 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class B : public A {
  public:
  class B_Entry {
  public:
  virtual void read(B* b_class) = 0;
  protected:
  FILE* get_fp(const B*) const;
  //...
  };
  friend class B_Entry;
}; 

...
void C::C_Entry::read(B* b_class)
{
 //...
 fread(/*...*/ , get_fp(b_class));
}
</code></pre>
<p>Das ist also nicht wesentlich anders als normale getter/setter, nur dass sich sich hier nicht in der gleichen Klasse wie die Daten selbst befinden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534492</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Mon, 23 Jun 2008 22:37:11 GMT</pubDate></item><item><title><![CDATA[Reply to Komplizierte Frage zu Vererbung und Zugriff on Tue, 24 Jun 2008 14:33:49 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/22486">@WX</a>: nein, das OOP ist genau was ich wollte. Vorher war es auf funktionen basierend, aber das war mir irgendwie keine Perfektion.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/6642">@camper</a>: Danke, die Idee ist gut. Ich habe aber gleich den FILE-Pointer in den Protected-Bereich von B geschrieben anstatt eine get-Funktion, das ist ja schneller so. Oder gibt es Gründe, eine get-Funktion hier zu nehmen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534850</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534850</guid><dc:creator><![CDATA[voidpointer]]></dc:creator><pubDate>Tue, 24 Jun 2008 14:33:49 GMT</pubDate></item></channel></rss>