<?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[Designproblem lösen]]></title><description><![CDATA[<p>Hi, ich bin der, der hier schon letztens das Problem mit dem Slicing hatte <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>Angedacht ist folgendes:</p>
<ul>
<li>Es soll eine Basisklasse &quot;A&quot; mit einer abstrakten Methode geben</li>
<li>Diese Basisklasse liefert den Benutzer über Methoden Instanzen/Objekte von einer Klasse B. Nur B ist für den Anwender der Klasse relevant, evtl. Klassen die von B erben interessieren ihn nicht</li>
</ul>
<pre><code class="language-cpp">class A
{
public:
virtual MyFunc() = 0;

std::vector&lt;B*&gt;&amp; AccessVec();

protected:
std::vector&lt;B*&gt; vec;
// std::vector&lt;B&gt; vec; Diese Variante wäre Ideal, ist aber wegen des Slicings nicht möglich 
};
</code></pre>
<p>Jetzt können verschiedene Klassen das &quot;Interface&quot; A mit der abstrakten Methode implementieren und ggfs. zur Realisierung Subtypen der Klasse B verwenden.<br />
Somit soll folgendes möglich sein:</p>
<pre><code class="language-cpp">A *ptrA = new Subtyp1();  // An einer Stelle kann der Benutzer jetzt sagen &quot;Nee, ich will jetzt mal die Ergebnisse von new Subtyp2() sehen
</code></pre>
<p><strong>Problem:</strong><br />
Ich muss das mit Pointern realisieren, weil ich sonst in den Klassen die A mit Subtypen von B implementieren nicht alle Informationen gespeichert bekomme.</p>
<p>Wie löse ich das Problem? Gibt's da ein tolles Designpattern?<br />
Falls ich das unklar erklärt habe: Einfach nachhaken <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/250310/designproblem-lösen</link><generator>RSS for Node</generator><lastBuildDate>Wed, 16 Sep 2026 02:23:14 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/250310.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 16 Sep 2009 13:55:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Designproblem lösen on Wed, 16 Sep 2009 13:55:27 GMT]]></title><description><![CDATA[<p>Hi, ich bin der, der hier schon letztens das Problem mit dem Slicing hatte <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>Angedacht ist folgendes:</p>
<ul>
<li>Es soll eine Basisklasse &quot;A&quot; mit einer abstrakten Methode geben</li>
<li>Diese Basisklasse liefert den Benutzer über Methoden Instanzen/Objekte von einer Klasse B. Nur B ist für den Anwender der Klasse relevant, evtl. Klassen die von B erben interessieren ihn nicht</li>
</ul>
<pre><code class="language-cpp">class A
{
public:
virtual MyFunc() = 0;

std::vector&lt;B*&gt;&amp; AccessVec();

protected:
std::vector&lt;B*&gt; vec;
// std::vector&lt;B&gt; vec; Diese Variante wäre Ideal, ist aber wegen des Slicings nicht möglich 
};
</code></pre>
<p>Jetzt können verschiedene Klassen das &quot;Interface&quot; A mit der abstrakten Methode implementieren und ggfs. zur Realisierung Subtypen der Klasse B verwenden.<br />
Somit soll folgendes möglich sein:</p>
<pre><code class="language-cpp">A *ptrA = new Subtyp1();  // An einer Stelle kann der Benutzer jetzt sagen &quot;Nee, ich will jetzt mal die Ergebnisse von new Subtyp2() sehen
</code></pre>
<p><strong>Problem:</strong><br />
Ich muss das mit Pointern realisieren, weil ich sonst in den Klassen die A mit Subtypen von B implementieren nicht alle Informationen gespeichert bekomme.</p>
<p>Wie löse ich das Problem? Gibt's da ein tolles Designpattern?<br />
Falls ich das unklar erklärt habe: Einfach nachhaken <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/1779828</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1779828</guid><dc:creator><![CDATA[Designer2000]]></dc:creator><pubDate>Wed, 16 Sep 2009 13:55:27 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem lösen on Wed, 16 Sep 2009 14:06:07 GMT]]></title><description><![CDATA[<blockquote>
<p>Ich muss das mit Pointern realisieren ...<br />
Wie löse ich das Problem?</p>
</blockquote>
<p>Die Loesung kennst du doch schon ... mit Pointern.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1779845</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1779845</guid><dc:creator><![CDATA[knivil]]></dc:creator><pubDate>Wed, 16 Sep 2009 14:06:07 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem lösen on Wed, 16 Sep 2009 14:12:32 GMT]]></title><description><![CDATA[<p>Ich denke auch, dass normale Polymorphie reichen sollte. Allerdings kannst du RAII mit Hilfe von Smart-Pointern umsetzen und somit eine Freigabe des Speichers sicherstellen.</p>
<pre><code class="language-cpp">std::vector&lt;B*&gt;&amp; AccessVec();
</code></pre>
<p>Als Anmerkung: Funktionen, die Non-Const-Referenzen auf Membervariablen zurückgeben, sind nicht gut, da sie das Kapselungsprinzip umgehen (da kannst du gerade so gut <code>public</code> -Member haben). Schränke die Zugriffsfunktionen also stärker ein, indem du zum Beispiel in Lese- und Schreibzugriff unterteilst und vielleicht nur wenige Operationen implementierst, für die nicht der ganze Container bekannt sein muss.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1779847</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1779847</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Wed, 16 Sep 2009 14:12:32 GMT</pubDate></item><item><title><![CDATA[Reply to Designproblem lösen on Wed, 16 Sep 2009 14:34:58 GMT]]></title><description><![CDATA[<p>Meinst du mit 'An einer Stelle kann der Benutzer jetzt sagen &quot;Nee, ich will jetzt mal die Ergebnisse von new Subtyp2() sehen&quot;' das hier?</p>
<pre><code class="language-cpp">#include&lt;iostream&gt;

using namespace std;

class A
{
protected:
  int member;
public:
  A(const A &amp;a): member(a.member){}
  A(const int &amp;i): member(i){}
  virtual void MyFunc() = 0;
}; 

class subtyp1: public A
{
public:
  subtyp1(const A&amp; a):A(a) {}
  subtyp1(const int&amp; i): A(i) {}
  virtual void MyFunc(){
    cout &lt;&lt; &quot;Typ 1: &quot; &lt;&lt;member &lt;&lt; endl;
  }
};

class subtyp2: public A
{
public:
  subtyp2(const A&amp; a):A(a) {}
  subtyp2(const int&amp; i): A(i) {}
  virtual void MyFunc(){
    cout &lt;&lt; &quot;Typ 2: &quot; &lt;&lt;member &lt;&lt; endl;
  }
};

int main(){
  A * ptrA = new subtyp1(1);
  ptrA-&gt;MyFunc();
  (static_cast&lt;subtyp2&gt;(*ptrA)).MyFunc();
}
</code></pre>
<p>Ausgabe:</p>
<pre><code>Typ 1: 1
Typ 2: 1
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1779868</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1779868</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 16 Sep 2009 14:34:58 GMT</pubDate></item></channel></rss>