<?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[Design Frage]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine kleine Designfrage zu C++.<br />
Ich baue mir eine sehr große Klasse, die ein Problem löst. Das Problem kann sie intern auf 2 Arten lösen (einmal über eine Box und einmal über eine Sphere), wobei der Benutzer die Technik auswählen soll.<br />
Box und Sphere Techniken haben viele Gemeinsamkeiten - die Klasse wird also viele private Methoden haben, die beide Techniken benutzen.</p>
<p>Zur Realisierung schweben mir folgende Ideen vor:</p>
<ol>
<li>Die Klasse bietet als Schnittstelle einfach alle Methoden beider Techniken an, also z.B: Klasse::BoxMethode1() und Klasse::SphereMethode1() usw.</li>
<li>Irgendwie intern einen Namespace eröffnen, so dass der User direkt die Techniken anspricht:<br />
Ein Aufruf wäre dann in etwa so: Klasse::Box-&gt;Methode1() oder Klasse::Sphere-&gt;Methode1()<br />
Allerdings weiß ich nicht, wie man das in C++ macht. (Innere Klasse?)</li>
</ol>
<p>Oder gibt es irgend ein Pattern oder sonst ne Idee, wie man das am elegantesten machen könnte?</p>
<p>Danke <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/202325/design-frage</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 14:09:20 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/202325.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 10 Jan 2008 00:00:43 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 00:00:43 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine kleine Designfrage zu C++.<br />
Ich baue mir eine sehr große Klasse, die ein Problem löst. Das Problem kann sie intern auf 2 Arten lösen (einmal über eine Box und einmal über eine Sphere), wobei der Benutzer die Technik auswählen soll.<br />
Box und Sphere Techniken haben viele Gemeinsamkeiten - die Klasse wird also viele private Methoden haben, die beide Techniken benutzen.</p>
<p>Zur Realisierung schweben mir folgende Ideen vor:</p>
<ol>
<li>Die Klasse bietet als Schnittstelle einfach alle Methoden beider Techniken an, also z.B: Klasse::BoxMethode1() und Klasse::SphereMethode1() usw.</li>
<li>Irgendwie intern einen Namespace eröffnen, so dass der User direkt die Techniken anspricht:<br />
Ein Aufruf wäre dann in etwa so: Klasse::Box-&gt;Methode1() oder Klasse::Sphere-&gt;Methode1()<br />
Allerdings weiß ich nicht, wie man das in C++ macht. (Innere Klasse?)</li>
</ol>
<p>Oder gibt es irgend ein Pattern oder sonst ne Idee, wie man das am elegantesten machen könnte?</p>
<p>Danke <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/1434045</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434045</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:00:43 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 00:17:21 GMT]]></title><description><![CDATA[<p>Mir fiele noch eine Möglichkeit ein, weiß aber nicht, wie gut sie bei dir reinpassen würde:</p>
<pre><code class="language-cpp">class Sonstwas
{
    public:
        enum CalcModus
        {
            Box,
            Sphere
        }

        void DoWhateverYouHaveToDo( CalcModus modus )
        {
            if ( modus == Box )
            {
            }
            else if ( modus == Sphere )
            {
            }
            else
            {
                cout &lt;&lt; &quot;Doofer Benutzer&quot; &lt;&lt; endl;
            }
        }
};

Sonstwas bla;
bla.WhateverYouHaveToDo( Sonstwas::Box );
</code></pre>
<p>Ansonsten fiele mir noch Polymorphie ein, also gemeinsame Oberklasse und die Box- und Sphere-Lösung als erweiternde konkrete Subklassen.</p>
<p>edit2: Hänge halt sehr von den Aufgabe der Klasse(n) ab <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/1434049</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434049</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:17:21 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 00:32:35 GMT]]></title><description><![CDATA[<blockquote>
<p>Box und Sphere Techniken haben viele Gemeinsamkeiten - die Klasse wird also viele private Methoden haben, die beide Techniken benutzen.</p>
</blockquote>
<p>Nimm Klasse Foo und pack alles da rein. Die Methoden, die nun eben entweder auf Sphere oder Box basieren, machst du pure virtual und implementierst später nochmal 2 Klassen, die eben von Foo ableiten und dann eben die Lösung beinhalten. So kann man sich für eine Methode entscheiden und Übergaben sind kein Problem, weil du ja immer einen Zeiger auf Foo übergeben kannst, auch wenn Methode abstrakt sind.<br />
Beispiel:</p>
<pre><code class="language-cpp">class Foo
{
  void irgendeineMethode();
  void neAndere();
  virtual void SchlüsselMethode() = 0;
};

class Box : public Foo
{
   virtual void SchlüsselMethode()
   {
       SomeReallyImportantSourceCode;
   }
};

class Sphere : public Foo
{
   virtual void SchlüsselMethode()
   {
       SomeReallyImportantSourceCode;
   }
};
</code></pre>
<p>rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434052</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434052</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:32:35 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 00:35:21 GMT]]></title><description><![CDATA[<p>Das hilft mir nicht viel, weil wie gesagt jede Technik einige eigene Methoden besitzt, die für den Benutzer zugreifbar sein sollen.</p>
<p>Polymorphie möchte ich eigentlich nicht benutzen, da ich im Hauptprogramm nur ein einziges Objekt haben möchte. Bei Polymorphie müsste ich 2 Instanzen anlegen, da die Box und Sphere Techniken unterschiedliche Methoden haben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434053</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434053</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:35:21 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 00:51:00 GMT]]></title><description><![CDATA[<p>Wann wird denn entschieden, welche Technik verwendet wird? Zur Kompilierzeit oder entscheidet das der User anhand von Programmoptionen?<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434056</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434056</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 10 Jan 2008 00:51:00 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 08:10:47 GMT]]></title><description><![CDATA[<p>Wenn zur Kompilierzeit entschieden wird helfen Policies.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434119</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434119</guid><dc:creator><![CDATA[Tyrdal]]></dc:creator><pubDate>Thu, 10 Jan 2008 08:10:47 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 08:13:55 GMT]]></title><description><![CDATA[<p>EinGast schrieb:</p>
<blockquote>
<p>...<br />
Polymorphie möchte ich eigentlich nicht benutzen, da ich im Hauptprogramm nur ein einziges Objekt haben möchte. Bei Polymorphie müsste ich 2 Instanzen anlegen, da die Box und Sphere Techniken unterschiedliche Methoden haben.</p>
</blockquote>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /><br />
Ähhh, dafür brauchst Du doch keine 2 Instanzen ? Nur 2 Klassen (ist ja klar; irgendwo musst Du ja die beiden &quot;Techniken&quot; implementieren) ....<br />
Weder bei Compilezeit-(templates) noch Laufzeitpolymorphie (virtual functions).....</p>
<p>Ich vermute, dass Du da etwas mißverstanden hast.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434121</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434121</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Thu, 10 Jan 2008 08:13:55 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 10:41:18 GMT]]></title><description><![CDATA[<p>EinGast schrieb:</p>
<blockquote>
<p>Das hilft mir nicht viel, weil wie gesagt jede Technik einige eigene Methoden besitzt, die für den Benutzer zugreifbar sein sollen.</p>
</blockquote>
<p>Definiere bitte &quot;fuer den Benutzer zugreifbar&quot; - schwebt dir sowas wie ne kommandozeile vor wo der Benutzer je nach Anwendugn verschiedene Befehle eingeben kann?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434191</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434191</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Jan 2008 10:41:18 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 11:04:26 GMT]]></title><description><![CDATA[<p>würde auf das Strategy-Pattern zurückgreifen<br />
oder Strategy gemixed mit Factory, kann man ganz gut kombinieren</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434206</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434206</guid><dc:creator><![CDATA[Vorden]]></dc:creator><pubDate>Thu, 10 Jan 2008 11:04:26 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 11:21:02 GMT]]></title><description><![CDATA[<p>EinGast schrieb:</p>
<blockquote>
<p>...Ich baue mir eine sehr große Klasse, die ein Problem löst...</p>
</blockquote>
<p>EinGast schrieb:</p>
<blockquote>
<p>...Polymorphie möchte ich eigentlich nicht benutzen, da ich im Hauptprogramm nur ein einziges Objekt haben möchte...</p>
</blockquote>
<p>Ich glaube eher das du dein Design gravierend ändern solltest. Zum einen sollten Klassen immer überschaubar bleiben (Ich kämpfe schon genug mit &quot;Gottklassen&quot; herum um zu wissen wovon ich rede und warum ich sie selbst vermeide). Zum anderen verstehe ich nicht warum du wirklich nur ein Objekt haben willst wenn es zwei Fälle zu geben scheint. Mit Objektorientierung hat das jedenfalls nichts mehr zu tun.</p>
<p>Vielleicht wäre es hilfreich mehr zu erfahren was du eigentlich vorhast.</p>
<p>Wenn ich nach deinen ersten Post gehe interessiert mich auch ob die Methoden (Klasse::Box-&gt;Methode1() / Klasse::Sphere-&gt;Methode1()...) im gleichen Anwendungsfall (nur mit unterschiedlichen Verhalten) oder gänzlich unterschiedlich verwendet werden.</p>
<p>Zudem gehe ich nach deinen bisherigen Beschreibungen davon aus das du die Objektorientierte Programmierung noch nicht wirklich verstanden hast, vielleicht kann man weiterhelfen wenn man mehr weiß.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434217</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 10 Jan 2008 11:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 14:50:50 GMT]]></title><description><![CDATA[<p>Ich denke ich hab die OOP recht gut verstanden. Es geht hier auch nicht direkt um die OOP, sondern um Design mittels OOP. Trotzdem Danke der Nachfrage <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="😉"
    /> <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="🙄"
    /></p>
<p>Im Moment habe ich 2 Klassen (Box und Sphere), die nahezu identisch sind, jedoch teilweise unterschiedliche Methoden haben (Sphere hat sowas wie getRadius() etc, was bei ner Box keinen Sinn macht und umgekehrt).</p>
<p>Im Hauptprogramm hab ich also nun von jeder Klasse eine Instanz (Box *b und Sphere* s) und über ein GUI kann der Benutzer die Render Technik (Box oder Sphere) wechseln.<br />
Pseudomäßig sieht es im Hauptprogramm also so aus:</p>
<pre><code class="language-cpp">if(technique == box)
  b-&gt;render();
else if(technique == sphere)
  s-&gt;render();
</code></pre>
<p>und wenn ich irgend ein Attribut änderen will, das für beide Techniken gilt, mach ich das im Moment immer doppelt:</p>
<pre><code class="language-cpp">if(neueFarbe) {
   b-&gt;setFarbe(farbe);
   s-&gt;setFarbe(farbe);
}
</code></pre>
<p>Nur finde ich diese ständige &quot;Doppelbehandlung&quot; im Code unschön und ich möchte das Kapseln.</p>
<p>Wenn ich jedoch 2 eigene Klassen habe, dann brauch ich im Programm ja wieder 2 Instanzen und gewinne nichts:</p>
<pre><code class="language-cpp">class Base { ... };
class Box : Base { }
class Sphere : Base { }

// Im Hauptprogramm dann:
Box* b = new Box;
Sphere* s = new Sphere;
</code></pre>
<p>Wenn ich eine Boxspezifische Methode aufruf, brauch ich ja einen Box Zeiger und dito für Sphere.</p>
<p>Am einfachsten wäre wohl wirklich eine Superklasse und dann innerhalb von Superklasse::Render(): if(box) boxrender() else sphererender()<br />
Das einzig unschöne wäre eben, dass die Klasse sowohl BoxMethoden als auch SphereMethoden hätte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434342</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 14:50:50 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:01:02 GMT]]></title><description><![CDATA[<p>Naja, dann machs doch so, wie ichs dir beschrieben habe...<br />
Mach ein Interface für beide und mach die Funtionen des Interfaces allgemeiner, damit beim Aufruf nicht mehr zwischen Radius und Fläche oder so unterschieden werden muss. Schreib daraus 2 Klassen.<br />
Und in deinem Programm reicht dann ein simples:</p>
<pre><code class="language-cpp">IBasisKlasse *Foo;

onChangeTechnique(int technique)
{
   if (Foo) delete Foo;
   if (technique == BOX)
      Foo = new Box;
   else if (technique == SPHERE)
      Foo = new Sphere;
   else
     error;
}
</code></pre>
<p>Resultat: Du musst nur einen Zeiger auf das Interface behalten und kannst den Rest kicken. Die 2x-Behandlung fällt damit weg.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434357</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434357</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:01:02 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:08:54 GMT]]></title><description><![CDATA[<p>Hm ja, also eigentlich ist die Lösung wirklich elegant. Das Problem ist nur, dass Box und Sphere eine sehr aufwändige Initialisierung haben (sehr rechenintensiver Algorithmus). Die Arbeit damit sieht also in etwa so aus:<br />
Box* b = new Box;<br />
b-&gt;setGanzVieleParameter()<br />
...<br />
b-&gt;calculate() // aufwändige Methode, die paar Sekunden benötigt<br />
// ab jetzt kann ich damit arbeiten</p>
<p>// dito für Sphere</p>
<p>Ich kann also leider nicht beim Wechseln ständig die Instanzen löschen und neue anlegen.<br />
Aber auch dann wäre die Lösung noch nicht perfekt, da ich ja beim Setzen einer (zB) Boxspezifischen Methode einen Downcast bräuchte:<br />
(dynamic_cast&lt;Box*&gt;(Foo))-&gt;setzeKantenLänge();</p>
<p>Auch nicht so das Wahre. <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1434366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434366</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:08:54 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:15:36 GMT]]></title><description><![CDATA[<p>Bleibt immernoch die Frage, ob der User von aussen vor dem Bildschirm Zugriff auf die spezifischen Methoden haben muss (z.B. Box::getRadius() ).<br />
Normalerweise macht man es wie folgt:</p>
<pre><code class="language-cpp">class BaseRenderer{
public:
  virtual void render() = 0;  //abstrakte Methode, muss jede Kindklasse selbst wissen wie sie das macht
  void setFarbe(Farbe f) {farbe = f}; //naja, das ist ueberall gleich
private:
  Farbe farbe;
};

class Sphere : public BaseRenderer {
public:
  void render() 
  {  /*hier steht wie die Sphere rendert*/
    int v = getRadius(); 
    /*und rechnet mit ihren speziellen Eigenschaften*/
  };
private:
  int getRadius();
};

class Box : public BaseRenderer {
  public:
  void render() {/*hier steht wie die Box rendert*/};
};

int main() {
  BaseRenderer* pbr;
  if (User_Will_Box) pbr = new Box();
  else pbr = new Sphere();

  pbr-&gt;setFarbe(GRUEN); //das ist einfach
  pbr-&gt;render();  //klappt auch super

  //Wenn man denn doch unbedingt mal wissen will was man eigentlich hat
  Sphere* ps = dynamic_cast&lt;Sphere*&gt;(pbr);
  if(ps) {cout &lt;&lt; &quot;Es ist eine Sphere, sie hat den Radius &quot; &lt;&lt; ps-&gt;getRadius() &lt;&lt; endl;
  else {cout &lt;&lt; &quot;Es ist eine Box, sowas hat keinen Radius!&quot; &lt;&lt; endl; }
}
</code></pre>
<p>Soweit doch ganz einfach. Wenn du OOP so gut verstanden hast, dann sollte Polymorphie doch eigentlich kein Fremdwort mehr sein oder?</p>
<p>/edit ich seh schon, war mal wieder zu spaet dran.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434371</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:15:36 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:20:15 GMT]]></title><description><![CDATA[<p>Und wenn du beide Objekte beim Start anlegst und einen globalen Zeiger (oder innerhalb der Klasse is ja egal) nimmst?<br />
Und beim Wechsel wechselst du nur den Zeiger...<br />
Zur Verdeutlichung:</p>
<pre><code class="language-cpp">IBase* Foo = NULL;

Box *g_Box = new Box();
Sphere *g_Sphere = new Sphere();

void onChange()
{
  Foo = g_Box;
  // oder
  Foo = g_Sphere;
}
</code></pre>
<p>Damit entfällt das initialisieren auf den Programmstart und du kannst jederzeit wechseln.<br />
Es wird zwar der Speicher für beide Objekte verbraucht, aber du solltest diese doppelten Aufrufe nicht mehr brauchen.</p>
<p>edit:</p>
<blockquote>
<p>Aber auch dann wäre die Lösung noch nicht perfekt, da ich ja beim Setzen einer (zB) Boxspezifischen Methode einen Downcast bräuchte:<br />
(dynamic_cast&lt;Box*&gt;(Foo))-&gt;setzeKantenLänge();</p>
</blockquote>
<p>Es spricht ja nix dagegen, dass die Klasse Box so eine Methode enthält. Schliesslich implementierst du ja nur eine abstrakte Klasse. Die kann ja noch mehr Methoden enthalten.<br />
rya.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434374</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434374</guid><dc:creator><![CDATA[[[global:former_user]]]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:20:15 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:19:25 GMT]]></title><description><![CDATA[<p>1. Klar braucht der Benutzer Zugriff auf spezifische Methoden<br />
2. Gleiches Problem wie oben. Wenn ich während die Anwendung läuft die Technik wechseln will, müsste ich das alte Objekt löschen und eine Instanz der jeweils anderen Klasse erstellen. Das geht jedoch aufgrund der aufwändigen Initialisierung nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434377</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434377</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:19:25 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:32:40 GMT]]></title><description><![CDATA[<p>Wenn du wirklich Box und Sphere parallel haben willst, kommst du wohl um zwei Klassen nicht herum, denn eine Monolithische Superklasse ist so gut wie immer Mist. Ich wuerde sogar ganze 4 (!) Klassen vorschlagen:<br />
- Eine Interfaceklasse (&quot;RenderInterface&quot;), die gemeinsame Methoden (wie render()) deklariert und von der deine Box und deine Sphere ableiten.<br />
- Eine Klasse, (&quot;RenderData&quot;) die Daten enthaelt, die unabhaengig von der Art der Rendererklasse sind (z.B. die Farbe udn damit auch die Methode SetFarbe())<br />
- Die Box leitet von RenderInterface ab und haelt einen Zeiger auf RenderData<br />
- Dito fuer Sphere.</p>
<pre><code class="language-cpp">class RenderInterface{
public:
  virtual void render() = 0;  //abstrakte Methode, muss jede Kindklasse selbst wissen wie sie das macht
  RenderData* getData() {return myData;}
private:
  RenderData* myData;
};

class RenderData {
  void setFarbe(Farbe f) {farbe = f}; //naja, das ist ueberall gleich
private:
  Farbe farbe;
};

class Sphere : public BaseRenderer {
public:
  void render()
  {  /*hier steht wie die Sphere rendert*/
    int v = getRadius();
    /*und rechnet mit ihren speziellen Eigenschaften*/
  };
private:
  int getRadius();
};

class Box : public BaseRenderer {
  public:
  void render() {/*hier steht wie die Box rendert*/};
};

int main() {
  RenderData rd;
  Box b(&amp;rd);
  Sphere s(&amp;rd);

  Sphere.getData()-&gt;setColor(GRUEN); //alles gruen
  Box.getData()-&gt;setColor(ROT); //na gut dann eben rot
  rd.setColor(ROT); //war doch schon rot!

  if (technique == SPHERE)
    s.render();
  else b.render();
  int v = b.getRadius();
}
</code></pre>
<p>Wenn mans ganz gewitzt machen moechte, implementiert man fuer RenderData referenzzaehlung, und fuer die Renderklassen einen standardkonstruktor, der ein neues Datenobjekt erzeugt und einen konstruktor, der von einem anderen Renderobjekt dessen Datenobjekt uebernimmt.</p>
<pre><code class="language-cpp">Box b; //legt sich ein eigenes Datenobjekt an
Sphere s(b); //hat jetzt das selbe Datenobjekt wie b
Sphere s2; //legt ein zweites Datenobjekt an
Box b2(s2); //teilt sich das Datenobjekt mit s2
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1434390</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434390</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:32:40 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 15:39:47 GMT]]></title><description><![CDATA[<p>Hehe, vielen Dank für eure Lösungstipps. <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f44d.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--thumbs_up"
      title=":+1:"
      alt="👍"
    /><br />
Ich werde es jetzt wohl so machen wie Scorcher24 es vorgeschlagen hat.</p>
<p>Aber da ich nach wie vor (wie jetzt) 2 Instanzen habe, ändere ich um Grunde garnicht so viel. Im Grunde habe ich dann bei BaseRenderer-&gt;Render() nach wie vor ein if(), nur dass es eben von der vtable ausgeführt wird;)<br />
Aber alleine die Vermeidung von doppeltem Code ist es wert es so zu machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434393</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434393</guid><dc:creator><![CDATA[EinGast]]></dc:creator><pubDate>Thu, 10 Jan 2008 15:39:47 GMT</pubDate></item><item><title><![CDATA[Reply to Design Frage on Thu, 10 Jan 2008 16:44:42 GMT]]></title><description><![CDATA[<p>Na, das &quot;if durch die vtable&quot; ist doch grade der witz an der vtable bzw. an Polymorphie allgemein!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1434445</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1434445</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Thu, 10 Jan 2008 16:44:42 GMT</pubDate></item></channel></rss>