<?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[Designfrage: Vererbung]]></title><description><![CDATA[<p>Ich habe, stark vereinfacht, folgendes Szenario:</p>
<p>Die public Methoden meiner Klasse sollen auf weitere Methoden zugreifen, die vom Klienten veraendert werden koennen bei Bedarf. Diese veraenderbaren Methoden benoetigen Zugriff auf einige Member der Klasse. Ich habe das momentan mit dem template method pattern geloest:</p>
<pre><code class="language-cpp">class P {
public:
  void foo() {bar1(); bar2(); bar3();}
  virtual ~P() {}
protected:
  virtual void bar1() {i1 = 3;}
  virtual void bar2() {i2 = 4;}
  virtual void bar3() {i3 = 5;}

  int i1, i2, i3;
};
</code></pre>
<p>Der Klient kann so von der Klasse ableiten, die bar-Methoden bei Bedarf ueberschreiben und alles ist schoen - bis auf den uneingeschraenkten Zugriff aller ableitenden Klassen auf i1, i2, i3.</p>
<p>Gibt es eine Moeglichkeit, den Zugriff auf die bar-Methoden der ableitenden Klassen zu beschraenken?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/203315/designfrage-vererbung</link><generator>RSS for Node</generator><lastBuildDate>Wed, 07 Oct 2026 12:11:44 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/203315.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 21 Jan 2008 14:34:39 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 14:34:39 GMT]]></title><description><![CDATA[<p>Ich habe, stark vereinfacht, folgendes Szenario:</p>
<p>Die public Methoden meiner Klasse sollen auf weitere Methoden zugreifen, die vom Klienten veraendert werden koennen bei Bedarf. Diese veraenderbaren Methoden benoetigen Zugriff auf einige Member der Klasse. Ich habe das momentan mit dem template method pattern geloest:</p>
<pre><code class="language-cpp">class P {
public:
  void foo() {bar1(); bar2(); bar3();}
  virtual ~P() {}
protected:
  virtual void bar1() {i1 = 3;}
  virtual void bar2() {i2 = 4;}
  virtual void bar3() {i3 = 5;}

  int i1, i2, i3;
};
</code></pre>
<p>Der Klient kann so von der Klasse ableiten, die bar-Methoden bei Bedarf ueberschreiben und alles ist schoen - bis auf den uneingeschraenkten Zugriff aller ableitenden Klassen auf i1, i2, i3.</p>
<p>Gibt es eine Moeglichkeit, den Zugriff auf die bar-Methoden der ableitenden Klassen zu beschraenken?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440650</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Jan 2008 14:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 15:01:04 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">private:
    int i1, i2, i3;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1440671</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440671</guid><dc:creator><![CDATA[Fellhuhn]]></dc:creator><pubDate>Mon, 21 Jan 2008 15:01:04 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 15:21:00 GMT]]></title><description><![CDATA[<p>Dann tuts folgendes aber nicht mehr:</p>
<pre><code class="language-cpp">class T : public P {
protected:
  virtual void bar1() {i1 = 15;} //FEHLER: i1 ist private member von P udn in T nicht zugaenglich
};
</code></pre>
<p>obiges sollte aber moeglich sein. Andererseits will ich folgendes verhindern:</p>
<pre><code class="language-cpp">class U: public P {
public:
  void meep() {i1 = 24;}  //ist erlaubt, da i1 protected member von P
};
</code></pre>
<p>Wie gesagt, auf i1, i2, i3 soll in abgeleiteten KLassen zugegriffen werdne koennen, allerdings NUR innerhalb der bar() methoden</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440697</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440697</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Jan 2008 15:21:00 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 16:14:09 GMT]]></title><description><![CDATA[<p>Nun ja...es laesst sich da immer etwas zusammencode <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="😃"
    /> Ueber den Sinn darf sich streiten lassen.</p>
<pre><code class="language-cpp">class P
{ 
public: 
  void foo()
  {
    access = true;
    bar1();
    bar2();
    bar3();
    access = false;
  }

  virtual ~P() {}

protected:
  void SetI1(int i)
  {
    if (access)
      i1 = i;
  }

  void SetI2(int i)
  {
    if (access)
      i2 = i;
  }

  void SetI3(int i)
  {
    if (access)
      i3 = i;
  }

  virtual void bar1()
  {
    SetI1(3);
  }

  virtual void bar2()
  {
    SetI2(4);
  }

  virtual void bar3()
  {
    SetI3(5);
  }

private:
  bool access;
  int i1, i2, i3; 
};
</code></pre>
<p>Ich denke mal, das ist (so in etwa) was du wolltest.</p>
<p>Gruß,<br />
DeSoVoDaMu</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440751</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440751</guid><dc:creator><![CDATA[DeSoVoDaMu]]></dc:creator><pubDate>Mon, 21 Jan 2008 16:14:09 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 16:26:48 GMT]]></title><description><![CDATA[<p>Naja, auch net so ganz... die SetI's koenne ja immer aufgerufen werden, nur ob sie Effekt haben ist dann ne andere frage. Da Lass ich demjenigen ders dann ableitet lieber den Zugriff als ihm was vorzusetzen was zwar funktioniert, aber nicht so wie ers vielleicht erwartet...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440762</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Mon, 21 Jan 2008 16:26:48 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Mon, 21 Jan 2008 18:01:44 GMT]]></title><description><![CDATA[<p>Hi Pumuckl,</p>
<p>die Regel ist doch ganz einfach: Felder immer privat. Dann definierst Du Dir in der Basisklasse protected-Setter-Methoden für die Felder, die Dir den Zugriff regulieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1440821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1440821</guid><dc:creator><![CDATA[Konrad Rudolph]]></dc:creator><pubDate>Mon, 21 Jan 2008 18:01:44 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Tue, 22 Jan 2008 07:38:42 GMT]]></title><description><![CDATA[<p>Hi Konrad,<br />
klar, die Setter Methoden sollte ich auf jeden Fall implementieren. Das ändert allerdings an der eigentlichen Problematik nichts: Ich kann dann in alle abgeleiteten Klassen auch außerhalb der bar()-Methoden auf diese Setter zugreifen. Ich war schon am Überlegen ob es ne Möglichkeit gibt, das über friends und evtl. Funktoren zu regeln, komme da aber auf keinen grünen Zweig.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441052</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Jan 2008 07:38:42 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Tue, 22 Jan 2008 07:56:51 GMT]]></title><description><![CDATA[<p>So fein granular kannst du die Zugriffskontrolle in C++ nicht einstellen - friend wäre eventuell eine Möglichkeit, aber da mußt du die bar()-Methoden ALLER potentiellen abgeleiteten Klassen auflisten.</p>
<p>Frage: Dürfen die bar()-Methoden der abgeleiteten Klassen deine Member beliebig ändern? Oder nur innerhalb der Möglichkeiten, die du vorgesehen hast?<br />
(und aus persönlichem Interesse: Was ist der Sinn dieser Klasse?)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441064</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441064</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Tue, 22 Jan 2008 07:56:51 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Tue, 22 Jan 2008 11:22:47 GMT]]></title><description><![CDATA[<p>Es geht um eine Klasse, die eine Handvoll Histogramme aus dem ROOT framework zusammen in ein Fenster zeichnet. Die dafuer zustanedige Methode Plot() erzeugt einen Canvas (die ROOT-Version eines Zeichenblattes) in einer vordefinierten Groesse, teilt diesen Canvas in zwei Teile (genannt Pads, ich plotte die Histogramme einmal in linearer und einmal in logarithmischer Darstellung), <strong>nimmt eine ganze Reihe Einstellungen bezueglich der Zeichenstile usw. vor</strong> und plottet schliesslich die Histogramme nacheinander in die beiden Pads.<br />
Der allgemeine Algorithmus dafuer ist also statisch, nur die Einstellungen die vorgenommen werden bezueglich der Plotstile sollen von klienten ueberschrieben werden koennen. Diese Einstellungen werden an verschiedenen Objekten vorgenommen (z.B. Linienarten an den Histogrammen, Hintergrundfarbe der Pads an den Pads usw.), daher braucht der Klient Zugriff auf die Histogramme. Ich kann leider keine Methoden zur verfuegung stellen, die einfach die Aufrufe an die Histogramme weiterleiten, da es fuer die Histogramme zig verschiedene Methoden gibt, die alle wichtig sien koennen, und ich in den naechsten Wochen noch was anderes machen moechte <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="😉"
    /> Reduzierter Code bisher:</p>
<p>TPlot.h:</p>
<pre><code class="language-cpp">#ifndef TPlot_h
#define TPlot_h
#include &lt;memory&gt;

#ifndef __CINT__
typedef double Double_t;
#endif

class TH1;     //Histogramm-Klasse
class TAxis;   //Histogramm-Achsen
class TCanvas; //Zeichenfeld
class TString;
class TLegend; //Legende fuer Zeichnungen

class TPlot {
private:
  //hide copies
  TPlot&amp; operator= (TPlot const&amp;);
  TPlot(TPlot const&amp;);
  //============

  /* Viel privates... */

public:
  TPlot(TH1* data, TH1* direct, TH1* resolved, bool log_b = true, bool lin_b = true);
  virtual ~TPlot();

  void ShowLinear(bool);
  void ShowLog(bool);

#ifdef __CINT__  
  void ShowLegends(unsigned char flags = 3 );
#else //CINT kommt mit den Shiftoperatoren nicht klar
  void ShowLegends(unsigned char flags = 1&lt;&lt;0 | 1&lt;&lt;1 );
#endif

  void Plot();
  void Print(TString const&amp; psname);

  class BadInstantiated {};

protected:
  std::auto_ptr&lt;TH1&gt; data_;
  std::auto_ptr&lt;TH1&gt; direct_;
  std::auto_ptr&lt;TH1&gt; resolved_;
  std::auto_ptr&lt;TH1&gt; mcall_;

  virtual void SetGlobalStyles() const;
  virtual void SetXaxisStyles(TAxis* xaxis);
  virtual void SetYaxisStyles(TAxis* yaxis);
  virtual void SetHistoStyles();
  virtual void SetPadStyles();
  virtual void SetLegendStyles(TLegend* legend);
};

#endif
</code></pre>
<p>TPlot.cxx</p>
<pre><code class="language-cpp">/* andere Methoden */
void TPlot::Plot()
{
  if (plotgood()) return;
  if(!lin &amp;&amp; !log) {
    cerr &lt;&lt; &quot;Error in &lt;TPlot::Plot()&gt;: Both linear and logarithmic set to false - nothing to plot.\n&quot;;
    return;
  }

  TH1* const maxhist = 
    (mcall_-&gt;GetMaximum() &gt; data_-&gt;GetMaximum()) ? mcall_.get() : data_.get();

  //Set plot styles
  SetGlobalStyles();                     //AUFRUF 
  SetXaxisStyles(maxhist-&gt;GetXaxis());   // DER
  SetYaxisStyles(maxhist-&gt;GetYaxis());   //VIRTUELLEN
  SetHistoStyles();                      //FUNKTIONEN

  //make canvas
  const int nxpads = lin&amp;&amp;log ? 2 : 1;
  const int canvwidth = 500*nxpads;
  const int canvheight = 300;
  canvas_.reset(new TCanvas);
  canvas_-&gt;SetCanvasSize(canvwidth, canvheight);
  canvas_-&gt;SetWindowSize(canvwidth+50, canvheight+50);
  canvas_-&gt;Divide(nxpads, 1);

  //draw pads
  for (int i=1; i &lt;= nxpads; ++i) {
    bool islog = (!lin || i==2);
    canvas_-&gt;cd(i);
    SetPadStyles();                //NOCH EINE VIRTUAL
    if(islog) gPad-&gt;SetLogy(); 
    maxhist-&gt;Draw(&quot;AXIS&quot;);
    data_-&gt;Draw(&quot;P SAME&quot;);
    resolved_-&gt;Draw(&quot;SAME&quot;);
    direct_-&gt;Draw(&quot;SAME&quot;);
    mcall_-&gt;Draw(&quot;SAME&quot;);
    //legends
    if(!islog &amp;&amp; legendlin) linleg_.reset(MakeLegend(xlegendlin, ylegendlin));
    if(islog &amp;&amp; legendlog) logleg_.reset(MakeLegend(xlegendlog, ylegendlog));
  }
}

void TPlot::SetHistoStyles() {  //ZUGRIFF AUF DIE PROTECTED MEMBER
  //set plot styles for data
  data_-&gt;SetMarkerStyle(19);
  data_-&gt;SetMarkerSize(1);

  //set plot styles for mcdir
  direct_-&gt;SetLineStyle(2);

  //set plot styles for mcres
  resolved_-&gt;SetLineStyle(3);

  //set plot styles for combined mcres &amp; mcdir
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1441198</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441198</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Jan 2008 11:22:47 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Tue, 22 Jan 2008 11:27:40 GMT]]></title><description><![CDATA[<p>Oh man, ich hab ne recht simple Methode gefunden: Ich aendere die Signatur der virtuellen Methoden und uebergebe ihnen Referenzen/Zeiger auf die noetigen Elemente. Damit haben nur die Methoden den Zugriff. Hab ich bei SetLegendStyle adoch auch schon gemacht *Kopf-&gt;Tisch*</p>
<pre><code class="language-cpp">void TPlot::Plot() {
  /* ... */
  SetHistoStyles(data_.get(), direct_.get(), resolved_.get(), mcall_.get());
  /* ... */ 
}

void TPlot::SetHistoStyles(TH1* data, TH1* direct, TH1* resolved, TH1* mcall) {  //ZUGRIFF AUF DIE PROTECTED MEMBER
  //set plot styles for data
  data-&gt;SetMarkerStyle(19);
  data-&gt;SetMarkerSize(1);

  //set plot styles for mcdir
  direct-&gt;SetLineStyle(2);

  //set plot styles for mcres
  resolved-&gt;SetLineStyle(3);

  //set plot styles for combined mcres &amp; mcdir
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1441203</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441203</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Tue, 22 Jan 2008 11:27:40 GMT</pubDate></item><item><title><![CDATA[Reply to Designfrage: Vererbung on Tue, 22 Jan 2008 15:50:48 GMT]]></title><description><![CDATA[<p>Dann merkt sich wer die Zeiger in der Klasse, uns du hast wieder dasselbe Problem.</p>
<p>Mach P doch einfach zum friend, oder leite P private von T ab, oder verwende using um die Sichtbarkeit der Integerlis aus T in P auf private zu verändern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1441375</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1441375</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Tue, 22 Jan 2008 15:50:48 GMT</pubDate></item></channel></rss>