<?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[Zugriff auf private Elemente]]></title><description><![CDATA[<p>Hallo allesamt,</p>
<p>folgendes (umfangreiches) Problem: Ich habe, um das Ganze zu vereinfachen, drei Klassen:</p>
<p>Klasse A) enthält wichtige Methoden/Routinen zur Aussteuerung eines Systems. Man könnte sie als &quot;Core&quot; des Programms ansehen.</p>
<p>Klass <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> ist eine Basisklasse die als Schnittstelle zwischen verschiedenen Librareis dient und beinhaltet nur pure virtual Methoden.</p>
<p>Klasse C) erbt von dieser Basisklasse und definiert die jeweiligen Methoden aus.</p>
<p>Anzumerken ist, dass <strong>KLASSE A UND C SINGLETONS SIND</strong>, und <strong>JEDE KLASSE IN EINER EIGENEN LIBRARY STECKT</strong>. Hier kurz simpler Code zu den drei Klassen (Definition der Methoden sind hier der Einfachheit halber inline):</p>
<p>Klasse A, Library A (CoreKlasse):</p>
<pre><code class="language-cpp">class CClassA : public Singleton&lt;CClassA&gt;
   {
   public:
      void MachWasA(void){};
      CClassA(void){};
      ~CClassA(void){};
   };
</code></pre>
<p>Klasse B, Library B (BasisKlasse/Interface):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class CClassB : public Singleton&lt;T&gt;
   {
   public:
      virtual void MachWasB(void) = 0;
      CClassB(void){};
      ~CClassB(void){};
   };
</code></pre>
<p>Klasse C, Library C (Irgendeine andere Klasse):</p>
<pre><code class="language-cpp">class CClassC : public CClassB&lt;CClassC&gt;
   {
   public:
      void MachWasB(void){};
      CClassC(void){};
      ~CClassC(void){};
   };
</code></pre>
<p>Library C (und damit auch CClassC) werden zu dem Hauptprogramm dynamisch zur Laufzeit dazugelinkt, das funktioniert auch alles einwandfrei. Für die Interessierten: Es entscheidet sich erst zur Laufzeit welche Lib mit welcher Funktionalität wirklich gebraucht wird. Klasse B ist praktisch die Schnittstelle die überall eingebunden wird. Klasse A und C &quot;wissen voneinender nix&quot;, ums so auszudrücken.</p>
<p>Das blöde ist jedoch, dass Klasse A bestimmte Membervariablen aus Klasse C abfragen muss (vice versa), also habe ich micht entschlossen genau diese Member aus der Klassendefinition zu entfernen, und das alles in einer weiteren &quot;globalen&quot; CFG-Klasse zu hinterlegen, die ebenfalls überall fest mit eingbunden wird (Ich hoffe man kann mir noch folgen ^^):</p>
<pre><code class="language-cpp">#define Cfg CCfg::getInstance() // Für Singleton-Instanz

class CCfg_ClassC
   {
   private:
      bool bTestflag;

   public:
      bool getTestFlag(){return this-&gt;bTestflag;};
      CCfg_ClassC(){};
      ~CCfg_ClassC(){};
   };

class CCfg : public Singleton&lt;CCfg&gt;
   {
   public:
      CCfg_ClassC ConfigFuerC;
      CCfg (void){};
      ~CCfg (void){};
   };
</code></pre>
<p>Soooooo, jetzt würde ich in Klasse A ne Methode machen, mit folgendem Code:</p>
<pre><code class="language-cpp">void CClassA::MachWasA(void)
   {
   if(Cfg-&gt;ConfigFuerC.getTestflag())
      fprintf(stdout, &quot;Hooray!\n&quot;);
   else
      fprintf(stdout, &quot;Och menno...\n&quot;);
   }
</code></pre>
<p>Soweit funktioniert's auch einwandfrei. Mein Problem ist jetzt nur das Verändern des Wertes von &quot;bTestflag&quot;. Klasse C soll die einzige sein, die darauf zugreifen kann, bzw. jede, die von Klasse B erbt, aber da der Member protected ist, geht das nicht. Eine Friend-Deklaration für Klasse B zu machen geht auch net, da die nicht an die Kinder weitergegeben werden. Bei C# könnte man prüfen ob ein bestimmtes Interface in der Klasse implementiert wurde - meines Wissens gibt's das in C++ leider nicht <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="😞"
    /></p>
<p>Hat irgendjemand irgendeine Idee? Vermutlich isses was total banales und ich denk nur wieder zu kompliziert... Auch völlig andere Lösungsansätze sind willkommen.</p>
<p>Danke schon mal im Voraus! Hoffe das ist alles einigermaßen schlüssig...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/215849/zugriff-auf-private-elemente</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 19:22:45 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/215849.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 16 Jun 2008 10:14:55 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zugriff auf private Elemente on Mon, 16 Jun 2008 10:19:37 GMT]]></title><description><![CDATA[<p>Hallo allesamt,</p>
<p>folgendes (umfangreiches) Problem: Ich habe, um das Ganze zu vereinfachen, drei Klassen:</p>
<p>Klasse A) enthält wichtige Methoden/Routinen zur Aussteuerung eines Systems. Man könnte sie als &quot;Core&quot; des Programms ansehen.</p>
<p>Klass <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--smiling_face_with_sunglasses"
      title="B)"
      alt="😎"
    /> ist eine Basisklasse die als Schnittstelle zwischen verschiedenen Librareis dient und beinhaltet nur pure virtual Methoden.</p>
<p>Klasse C) erbt von dieser Basisklasse und definiert die jeweiligen Methoden aus.</p>
<p>Anzumerken ist, dass <strong>KLASSE A UND C SINGLETONS SIND</strong>, und <strong>JEDE KLASSE IN EINER EIGENEN LIBRARY STECKT</strong>. Hier kurz simpler Code zu den drei Klassen (Definition der Methoden sind hier der Einfachheit halber inline):</p>
<p>Klasse A, Library A (CoreKlasse):</p>
<pre><code class="language-cpp">class CClassA : public Singleton&lt;CClassA&gt;
   {
   public:
      void MachWasA(void){};
      CClassA(void){};
      ~CClassA(void){};
   };
</code></pre>
<p>Klasse B, Library B (BasisKlasse/Interface):</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class CClassB : public Singleton&lt;T&gt;
   {
   public:
      virtual void MachWasB(void) = 0;
      CClassB(void){};
      ~CClassB(void){};
   };
</code></pre>
<p>Klasse C, Library C (Irgendeine andere Klasse):</p>
<pre><code class="language-cpp">class CClassC : public CClassB&lt;CClassC&gt;
   {
   public:
      void MachWasB(void){};
      CClassC(void){};
      ~CClassC(void){};
   };
</code></pre>
<p>Library C (und damit auch CClassC) werden zu dem Hauptprogramm dynamisch zur Laufzeit dazugelinkt, das funktioniert auch alles einwandfrei. Für die Interessierten: Es entscheidet sich erst zur Laufzeit welche Lib mit welcher Funktionalität wirklich gebraucht wird. Klasse B ist praktisch die Schnittstelle die überall eingebunden wird. Klasse A und C &quot;wissen voneinender nix&quot;, ums so auszudrücken.</p>
<p>Das blöde ist jedoch, dass Klasse A bestimmte Membervariablen aus Klasse C abfragen muss (vice versa), also habe ich micht entschlossen genau diese Member aus der Klassendefinition zu entfernen, und das alles in einer weiteren &quot;globalen&quot; CFG-Klasse zu hinterlegen, die ebenfalls überall fest mit eingbunden wird (Ich hoffe man kann mir noch folgen ^^):</p>
<pre><code class="language-cpp">#define Cfg CCfg::getInstance() // Für Singleton-Instanz

class CCfg_ClassC
   {
   private:
      bool bTestflag;

   public:
      bool getTestFlag(){return this-&gt;bTestflag;};
      CCfg_ClassC(){};
      ~CCfg_ClassC(){};
   };

class CCfg : public Singleton&lt;CCfg&gt;
   {
   public:
      CCfg_ClassC ConfigFuerC;
      CCfg (void){};
      ~CCfg (void){};
   };
</code></pre>
<p>Soooooo, jetzt würde ich in Klasse A ne Methode machen, mit folgendem Code:</p>
<pre><code class="language-cpp">void CClassA::MachWasA(void)
   {
   if(Cfg-&gt;ConfigFuerC.getTestflag())
      fprintf(stdout, &quot;Hooray!\n&quot;);
   else
      fprintf(stdout, &quot;Och menno...\n&quot;);
   }
</code></pre>
<p>Soweit funktioniert's auch einwandfrei. Mein Problem ist jetzt nur das Verändern des Wertes von &quot;bTestflag&quot;. Klasse C soll die einzige sein, die darauf zugreifen kann, bzw. jede, die von Klasse B erbt, aber da der Member protected ist, geht das nicht. Eine Friend-Deklaration für Klasse B zu machen geht auch net, da die nicht an die Kinder weitergegeben werden. Bei C# könnte man prüfen ob ein bestimmtes Interface in der Klasse implementiert wurde - meines Wissens gibt's das in C++ leider nicht <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="😞"
    /></p>
<p>Hat irgendjemand irgendeine Idee? Vermutlich isses was total banales und ich denk nur wieder zu kompliziert... Auch völlig andere Lösungsansätze sind willkommen.</p>
<p>Danke schon mal im Voraus! Hoffe das ist alles einigermaßen schlüssig...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1529987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1529987</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Mon, 16 Jun 2008 10:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Mon, 16 Jun 2008 11:40:00 GMT]]></title><description><![CDATA[<p>Kurz eine Frage: Warum sollte man eine Klasse in eine seperate Lib auslagern ? Mir ist kein Fall bekannt in dem so etwas sinnvoll ist. Mach doch eine Klasse Interface, welche die gemeinsamen Funktionen von B und C deklariert und bilde dann die Subklassen B und C.</p>
<pre><code class="language-cpp">class Interface
{
  virtual void Hallo();
}

class B: public Interface
{
  void Hallo();
}

class A: public Interface
{
  void Hallo();
}

int main(int argc, char** argv)
{
  Interface* interface;

  if (Test())
    interface = new A();
  else 
    interface = new B();
  interface-&gt;Hallo();
}
</code></pre>
<p>Ich würde dir generell das Broker Pattern (<a href="http://www.vico.org/pages/PatronsDisseny/Pattern%20Broker/" rel="nofollow">http://www.vico.org/pages/PatronsDisseny/Pattern%20Broker/</a>) empfehlen da du ja anscheinend zwei Klassen Dienste anbieten und diese getrennt voneinander agieren. Könnt aber auch möglich sein dass ich damit Spatzen auf Kanonen schiesse.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530034</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530034</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Mon, 16 Jun 2008 11:40:00 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Mon, 16 Jun 2008 12:00:30 GMT]]></title><description><![CDATA[<p>Hi,</p>
<p>es geht bei mir darum, dass ich eine möglichst modulare Engine schreibe, was auch das Handling von Render- und/oder &quot;Window&quot;-APIs mit einschließt. Heißt soviel wie, ich kann je nach Konfiguration SDL oder Win32 - DirectX oder OpenGL auswählen. In jeder Library befindet sich praktisch eine API die dann später dynamisch dazugelinkt wird. Deswegen die verschiedenen Libs, für die modularität, bzw. Erweiterbarkeit.</p>
<p>Gruß,<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530048</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530048</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Mon, 16 Jun 2008 12:00:30 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Mon, 16 Jun 2008 12:12:11 GMT]]></title><description><![CDATA[<p>Okay, ich hab das ganze jetzt erstmal anders geregelt. Ich habe die Klassen jetzt soweit gegenseitig bekannt gemacht, dass ich über Get-Methoden auf meine Flags zugreifen kann...</p>
<p>Falls jemand trotzdem noch Hinweise/Anmerkungen/Kritik/Ideen zu o.g. Struktur hat, einfach schreiben.</p>
<p>Gruß,<br />
PuerNoctis</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530058</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530058</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Mon, 16 Jun 2008 12:12:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Tue, 17 Jun 2008 11:39:11 GMT]]></title><description><![CDATA[<p>Verstehe ich das richtig ? Du willst eine Engine bauen, welche nur über eine Projektconfig DirectX, OpenGL, SDL oder Windows (GDI) unter einen Hut bringt ?</p>
<p>Das ist keine leichte Aufgabe, denn jede Bib hat so ihre Tücken und Macken. Und nicht jedes grafisches Objekt lässt sich leicht von der Windows GDI in DirectX transformieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530771</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530771</guid><dc:creator><![CDATA[Bitte ein Bit]]></dc:creator><pubDate>Tue, 17 Jun 2008 11:39:11 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Tue, 17 Jun 2008 11:48:41 GMT]]></title><description><![CDATA[<p>Ist mir bewusst, und es ist mir klar, dass das ein harte Stück Arbeit ist <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="🙂"
    /> Aber ich hab' mir einfach mal gedacht, das probierste jetzt - kann nur davon lernen <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>
<p>Ich versuche tatsächlich, und dem kann man gut und gerne mit einem Lachen begenen, diese ganzen APIs nach außen gleich hinzustellen, alle &quot;unter einen Hut zu bringen&quot;. Bis jetzt muss ich sagen klappt das sogar prima, hätte ich nicht gedacht. Probleme gibt es aber trotzdem immer wieder, schon allein weil OGL eine State-getriebene API ist, DX nicht....</p>
<p>Mal gucken wie weit ich noch komme <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>
<p>EDIT: Rechtschreibfehler...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530784</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Tue, 17 Jun 2008 11:48:41 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Tue, 17 Jun 2008 14:27:12 GMT]]></title><description><![CDATA[<p>PuerNoctis schrieb:</p>
<blockquote>
<p>Ist mir bewusst, und es ist mir klar, dass das ein harte Stück Arbeit ist <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="🙂"
    /> Aber ich hab' mir einfach mal gedacht, das probierste jetzt - kann nur davon lernen <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>
<p>Ich versuche tatsächlich, und dem kann man gut und gerne mit einem Lachen begenen, diese ganzen APIs nach außen gleich hinzustellen, alle &quot;unter einen Hut zu bringen&quot;. Bis jetzt muss ich sagen klappt das sogar prima, hätte ich nicht gedacht. Probleme gibt es aber trotzdem immer wieder, schon allein weil OGL eine State-getriebene API ist, DX nicht....</p>
<p>Mal gucken wie weit ich noch komme <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>
<p>EDIT: Rechtschreibfehler...</p>
</blockquote>
<p>Da wünsche ich dir viel Glück! <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 />
Es kommt hald drauf an, inwiefern du spezielle Features benutzen willst. So grundsätzliche Sachen sind bestimmt relativ einfach, aber sobald es komplexere Dinge werden geht das mit einer anderen API vlt. gar nicht.<br />
Aber viel lernen kannst du da bestimmt, auch wenn ich, wenn ich dich wäre nicht allzu grosse Hoffnungen machen würde, dass es am Schluss wirklich was &quot;brauchbares&quot; wird. <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>
<p>btw.<br />
Kompliment für die schöne Beschreibung oben! Sieht man hier leider sehr selten, dass es eine so schön übersichtliche Beschreibung des Problemes gibt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530920</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530920</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 17 Jun 2008 14:27:12 GMT</pubDate></item><item><title><![CDATA[Reply to Zugriff auf private Elemente on Tue, 17 Jun 2008 14:58:05 GMT]]></title><description><![CDATA[<p>Danke für das Kompliment <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 />
Leider weiß ich nur zu gut, dass es die Hölle ist sich in fremdem und zum Großteil unkommentiertem Code reinzulesen, deswegen die Mühe. Obwohl's trotzdem noch nen Tick besser ginge ^^.</p>
<p>Die Sache mit den speziellen Features wird wirklich noch eine große Hürde. Entweder ich implementiere irendwelche rechenintensiven Workarounds die gewisse Funktionalität in den anderen APIs wiederspiegelt, oder ich beschneide die jeweilige API eben um diese speziellen Dinge..... oder das Projekt wird mangels Machbarkeit eingestellt. Egal wie, schon allein das Ziel so etwas zu schaffen hilft bei der Steigerung der Kreativität, daher mache ich mir jetzt mal keine Gedanken darum ob's am Ende wirklich &quot;was brauchbares&quot; ist. <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>
<p>Aber das eigentliche Problem hat sich ja erstmal erledigt. Danke für die Comments.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1530956</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1530956</guid><dc:creator><![CDATA[PuerNoctis]]></dc:creator><pubDate>Tue, 17 Jun 2008 14:58:05 GMT</pubDate></item></channel></rss>