<?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[Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc..]]></title><description><![CDATA[<p>Hallo,</p>
<p>im Moment sieht mein code vereinfacht und pseudo so aus:</p>
<pre><code class="language-cpp">class Basis
{
     //ein paar funktionen hier die aber nichts
     //zu meiner frage beitragen

     protected:
         virtual void foo() = 0;
};

class C1 : Basis
{
      public:

      protected:
          virtual void foo();
}

class C2 : Basis
{
      protected: 
        virtual void foo();
}
</code></pre>
<p>Jetzt sollen abhängig von einem user-parameter der grob gesagt die werte 0 - 3 haben kann von der Klasse C2 in der Methode foo() unterschiedliche Dinge passsieren. Z.B Statt der funktion a() die foo() aufgerufen wird, jetzt eine funktion b() aufrufen:</p>
<pre><code class="language-cpp">C2::foo()
{
      //....

     a()

     //..
}
</code></pre>
<p>Thematisch gehörte das aber alles in die Klasse C2 weil die sozusagen wieder so eine art Basisklasse für die 4 verschiedenen parameter.</p>
<p>Ich möchte nicht für 4 parameter ständig if-elsif-elsif-else zweige verwenden und dacht evtl. daran 4 weiter Klassen zu bauen die alle ein spezielles foo() implementieren. Allerdings habe ich dann code 4-fach, bis halt auf ein paar ausnahmen. Wie macht man denn sowas? Sollte man da evlt. die Klasse C2 wieder als Basis für 4 weitere Klassen halten?</p>
<p>Über ANregungen würde ich mich freuen - und ich kann keinen code hier zeigen weil es sonst den rahmen sprengen würde. Also bitte nicht mit solchen antworten. Danke <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/topic/195012/brächte-rat-bei-klassendesign-abstrakte-basisklasse-etc</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 19:22:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195012.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 12 Oct 2007 19:08:48 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 19:08:48 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>im Moment sieht mein code vereinfacht und pseudo so aus:</p>
<pre><code class="language-cpp">class Basis
{
     //ein paar funktionen hier die aber nichts
     //zu meiner frage beitragen

     protected:
         virtual void foo() = 0;
};

class C1 : Basis
{
      public:

      protected:
          virtual void foo();
}

class C2 : Basis
{
      protected: 
        virtual void foo();
}
</code></pre>
<p>Jetzt sollen abhängig von einem user-parameter der grob gesagt die werte 0 - 3 haben kann von der Klasse C2 in der Methode foo() unterschiedliche Dinge passsieren. Z.B Statt der funktion a() die foo() aufgerufen wird, jetzt eine funktion b() aufrufen:</p>
<pre><code class="language-cpp">C2::foo()
{
      //....

     a()

     //..
}
</code></pre>
<p>Thematisch gehörte das aber alles in die Klasse C2 weil die sozusagen wieder so eine art Basisklasse für die 4 verschiedenen parameter.</p>
<p>Ich möchte nicht für 4 parameter ständig if-elsif-elsif-else zweige verwenden und dacht evtl. daran 4 weiter Klassen zu bauen die alle ein spezielles foo() implementieren. Allerdings habe ich dann code 4-fach, bis halt auf ein paar ausnahmen. Wie macht man denn sowas? Sollte man da evlt. die Klasse C2 wieder als Basis für 4 weitere Klassen halten?</p>
<p>Über ANregungen würde ich mich freuen - und ich kann keinen code hier zeigen weil es sonst den rahmen sprengen würde. Also bitte nicht mit solchen antworten. Danke <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/1384047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384047</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Fri, 12 Oct 2007 19:08:48 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 20:48:51 GMT]]></title><description><![CDATA[<p>Weiß nicht genau was du willst ... also natürlich kannst du bar(c2) als base nehmen ...</p>
<pre><code class="language-cpp">class base
{
protected:
    virtual void call() = 0;
};

class foo : base
{
protected:
    void call();
};

class bar_base : base
{
protected:
    virtual void call();
};

class bar : bar_base
{
protected:
    void call();
};
</code></pre>
<p>... oder:</p>
<pre><code class="language-cpp">class base
{
protected:
    virtual void call() = 0;
};

class foo : base
{
protected:
    void call();
};

class bar : base
{
    typedef void (base::*fnPtr)() const;
    enum type 
    { a, b, c, d};
    const type m_type;

protected:
    std::map&lt;type, fnPtr&gt; m_calltype;

public: 
    bar(type const&amp; call) : m_type(call) {}

protected:
    void call() { (*this.*m_calltype[m_type])(); }
};

class bar_derived : bar
{
public:
    bar_derived() : bar(a) { m_calltype.insert(std::make_pair(type::a, bar_derived::foo)); }

public:
    void foo() const { std::cout &lt;&lt; &quot;bar_derived!&quot; &lt;&lt; std::endl; }
};
</code></pre>
<p><img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384112</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384112</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 12 Oct 2007 20:48:51 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 20:56:16 GMT]]></title><description><![CDATA[<p>Könntest Du vielleicht ein paar Worte verlieren was da im zweiten fall passiert? Function-Pointer? <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/1384122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384122</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Fri, 12 Oct 2007 20:56:16 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 21:00:05 GMT]]></title><description><![CDATA[<p>Ach, der schreibt immer so verwirrenden Code <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f921.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--clown_face"
      title=":clown:"
      alt="🤡"
    /></p>
<p>Wenn der Code so ähnlich ist, mach doch einfach eine switch-Unterscheidung. Deshalb solltest du keine 4 neuen Klassen entwerfen, das Konzept von OOP ist das ja nicht gerade.. Ein Kindklasse soll ja zur Elternklasse immer eine Ist-Ein-Beziehung haben und sie sollte vor allem _nötig_ sein <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/1384125</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384125</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Fri, 12 Oct 2007 21:00:05 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 21:04:07 GMT]]></title><description><![CDATA[<p>Ok - danke....aber:</p>
<p>[quote]mach doch einfach eine switch-Unterscheidung[quote]</p>
<p>wie meinst du das? Meinst du evtl. ich sollte 4mal die methode schreiben mit jeweils der kleinen änderungen aber halt davor in die richtige mit switch verweisen?</p>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384131</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384131</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Fri, 12 Oct 2007 21:04:07 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 21:13:18 GMT]]></title><description><![CDATA[<p>Wie der ist doch nicht verwirrend <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>
<blockquote>
<p>Function-Pointer? <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>
</blockquote>
<p>Nee... das wäre doch zu einfach <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /> Bzw. schon ... aber keine einfachen sondern sog. Method-Pointer.</p>
<pre><code class="language-cpp">class bar : base
{
    typedef void (base::*fnPtr)() const; // So sollen unsere Funktionen aussehen (void #name () const) ...
    enum type
    { a, b, c, d}; // diese Funktionstypen soll es geben ... kannst auch einfach einen Integer odg. nehmen. Ist nur damit du die Funktion eindeutig auswählen kannst.
    const type m_type; // const und private damit uns keiner mehr dran rumfummelt ... unser aktuelle Funktions-ID

protected:
    std::map&lt;type, fnPtr&gt; m_calltype; // Map in der alle Method-Pointer einer ID zugewiesen sind.

public:
    bar(type const&amp; call) : m_type(call) {} // Im Kontruktor die Method-Pointer-ID festlegen ...

protected:
    void call() { (*this.*m_calltype[m_type])(); } // Aufruf des Method-Pointer, der der aktuellen ID(m_type) zugewiesen ist. 
    // Das ist allerdings nur Pseudocode. Normal musst du hingehen und std::map&lt;...&gt;::iterator it = m_calltype.find(m_type); if (it != m_calltype.end()) (*this.*(it-&gt;second))(); nehmen ... 
    // also erst gucken ob überhaupt ein Method-Pointer für diese ID registriert ist ... 
    // wenn ja, soll der Method-Pointer mit dem this-Zeiger aufgerufen werden.
};
</code></pre>
<p>... das zur Erklärung ...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384138</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384138</guid><dc:creator><![CDATA[*D*Evil]]></dc:creator><pubDate>Fri, 12 Oct 2007 21:13:18 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Fri, 12 Oct 2007 21:17:19 GMT]]></title><description><![CDATA[<p>puh.....danke.....da fängt man an zu glauben man könnte ein klitzeklein wenig programmieren und dann sowas <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/1384143</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384143</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Fri, 12 Oct 2007 21:17:19 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Sat, 13 Oct 2007 05:07:47 GMT]]></title><description><![CDATA[<blockquote>
<p>Allerdings habe ich dann code 4-fach, bis halt auf ein paar ausnahmen. Wie macht man denn sowas?</p>
</blockquote>
<p>Denn Teil vom Code der gleich ist ein Unterfunktionen der Basisklasse aufteilen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384226</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384226</guid><dc:creator><![CDATA[MushARingDumADooDumADa]]></dc:creator><pubDate>Sat, 13 Oct 2007 05:07:47 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Sat, 13 Oct 2007 12:17:32 GMT]]></title><description><![CDATA[<p>sehe ich das richtig, dass ich mit den method-pointern einfach nur eine instanz von bar erzeuge und mittels des übergebenen arguments automatisch in dir richtige methode von den derived-klassen springe? oder doch nicht ? <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="😕"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1384362</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384362</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Sat, 13 Oct 2007 12:17:32 GMT</pubDate></item><item><title><![CDATA[Reply to Brächte Rat bei Klassendesign: Abstrakte Basisklasse etc.. on Sat, 13 Oct 2007 12:21:20 GMT]]></title><description><![CDATA[<blockquote>
<p>Denn Teil vom Code der gleich ist ein Unterfunktionen der Basisklasse aufteilen.</p>
</blockquote>
<p>ja das habe ich schon, nur trotzdem sieht es dann so aus:</p>
<pre><code class="language-cpp">class derived : basis
{

protected:
        virtual void foo()
       {
             //basis-funktionen
             basefunc1();
             basefunc2();
             basefunc3();

             //hier jetzt eben anhand eines parameters:
            if(param ==1)
                 //und noch weiteres
                 fkta();
            elsif (param == 2)
                 //und noch ein paar andere kleinigkeiten
                 fktb();
            else
                 fktc();

             //basis-fuktionen
            basefunc4();
            basefunc5();
             ....
       }

};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1384365</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1384365</guid><dc:creator><![CDATA[testo]]></dc:creator><pubDate>Sat, 13 Oct 2007 12:21:20 GMT</pubDate></item></channel></rss>