<?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[Factory-Klasse richtig gestalten]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verzweifle leider aktuell an dem Management meiner Daten, ich hoffe ihr könnt mir helfend zur Seite stehen. Ich sage gleich zu Anfang, dass ich noch kein ausgelernter C++ Profi bin und bin deswegen für kleinschrittige Erklärungen sehr dankbar.</p>
<p>Meine Klassenhierarchie:</p>
<p>StandartItem<br />
|<br />
-------<br />
| |<br />
UpgradeableItem Normalitem</p>
<p>(EDIT: Da man das leider nicht richtig erkennt: Standartitem ist Oberklasse der beiden anderen)</p>
<p>Beide Unterklassen haben dann wieder einige Unterklassen, aber das ist im Grunde egal. Alle Klassen haben jedenfalls die Public-Methode loadFromJSON. Alles ist so gegliedert, dass diese Methode natürlich immer alle alten Methoden der vorgängerklassen am Anfang aufruft. Nun zu meinem &quot;Problem&quot;:</p>
<p>Ich möchte alle meine Daten zusammen in einer Liste abspeichern (ich benutze QList ist aber ja irrelevant). Der Type der Items dieser Liste soll nun StandartItem sein. Ich möchte aber dieser Liste auch NormalItems und UpgradeableItems hinzufügen können, was durch die Vererbung ja problemlos funktionieren sollte. Ich frage mich nur wie. In meinem Kopf schwirrt folgende Idee:</p>
<pre><code>StandartItem factoryFunc(JSON json) {
  if (json.type == normal)
    return NormalItem.fromJSON(json)
  else
    return UpgradeableItem.fromJSON(json);
}

//Aufruf dann
list.add(factoryFunc(json));
</code></pre>
<p>Das ist natürlich Pseudocode, aber ich habe leider absolut keine Ahnung, wie ich da vorgehen muss. MUSS ich hier mit Pointern arbeiten oder geht das auch anders?</p>
<p>Vielen Dank für alle eure Hinweise <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/337203/factory-klasse-richtig-gestalten</link><generator>RSS for Node</generator><lastBuildDate>Sat, 18 Apr 2026 08:25:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/337203.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 15 Mar 2016 23:58:29 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Factory-Klasse richtig gestalten on Wed, 16 Mar 2016 01:35:44 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich verzweifle leider aktuell an dem Management meiner Daten, ich hoffe ihr könnt mir helfend zur Seite stehen. Ich sage gleich zu Anfang, dass ich noch kein ausgelernter C++ Profi bin und bin deswegen für kleinschrittige Erklärungen sehr dankbar.</p>
<p>Meine Klassenhierarchie:</p>
<p>StandartItem<br />
|<br />
-------<br />
| |<br />
UpgradeableItem Normalitem</p>
<p>(EDIT: Da man das leider nicht richtig erkennt: Standartitem ist Oberklasse der beiden anderen)</p>
<p>Beide Unterklassen haben dann wieder einige Unterklassen, aber das ist im Grunde egal. Alle Klassen haben jedenfalls die Public-Methode loadFromJSON. Alles ist so gegliedert, dass diese Methode natürlich immer alle alten Methoden der vorgängerklassen am Anfang aufruft. Nun zu meinem &quot;Problem&quot;:</p>
<p>Ich möchte alle meine Daten zusammen in einer Liste abspeichern (ich benutze QList ist aber ja irrelevant). Der Type der Items dieser Liste soll nun StandartItem sein. Ich möchte aber dieser Liste auch NormalItems und UpgradeableItems hinzufügen können, was durch die Vererbung ja problemlos funktionieren sollte. Ich frage mich nur wie. In meinem Kopf schwirrt folgende Idee:</p>
<pre><code>StandartItem factoryFunc(JSON json) {
  if (json.type == normal)
    return NormalItem.fromJSON(json)
  else
    return UpgradeableItem.fromJSON(json);
}

//Aufruf dann
list.add(factoryFunc(json));
</code></pre>
<p>Das ist natürlich Pseudocode, aber ich habe leider absolut keine Ahnung, wie ich da vorgehen muss. MUSS ich hier mit Pointern arbeiten oder geht das auch anders?</p>
<p>Vielen Dank für alle eure Hinweise <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/2490453</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490453</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Wed, 16 Mar 2016 01:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to Factory-Klasse richtig gestalten on Wed, 16 Mar 2016 06:50:02 GMT]]></title><description><![CDATA[<p>du kannst keiner Value Objekte auf die Basisklasse casten,<br />
da dann das passiert<br />
<a href="https://en.wikipedia.org/wiki/Object_slicing" rel="nofollow">https://en.wikipedia.org/wiki/Object_slicing</a></p>
<p>du musst pointer oder references verwenden</p>
<p>pseudo code</p>
<pre><code>unique_ptr&lt;StandardItem&gt; factory(JSON json)
{
  unique_ptr&lt;StandardItem&gt; item ;

  if (json.type == normal)
    item.reset(new NormalItem()) ;
  else
    item.reset(new UpgradeableItem()) ;

  item-&gt;fromJSON(json) ;

  return item ; 
}
</code></pre>
<p>so bekommst du pointer auf die base klasse und die sind polymorph, was das ist was du suchst,<br />
daher 'c++ polymorphism' in die Suchmaschine und einlesen</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490458</guid><dc:creator><![CDATA[kurze_frage]]></dc:creator><pubDate>Wed, 16 Mar 2016 06:50:02 GMT</pubDate></item><item><title><![CDATA[Reply to Factory-Klasse richtig gestalten on Wed, 16 Mar 2016 13:43:24 GMT]]></title><description><![CDATA[<p>vielen Dank, mit Polymorph hatte ich mich im Vorfeld schon beschäftigt. Dann werde ich das mal so umsetzen, vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2490556</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490556</guid><dc:creator><![CDATA[Frolo]]></dc:creator><pubDate>Wed, 16 Mar 2016 13:43:24 GMT</pubDate></item><item><title><![CDATA[Reply to Factory-Klasse richtig gestalten on Thu, 17 Mar 2016 09:51:53 GMT]]></title><description><![CDATA[<p>An der Stelle wäre evtl. auch sinnvoll, die Objekte direkt im Konstruktor aus dem JSON zu konstruieren:</p>
<pre><code>std::unique_ptr&lt; StandardItem &gt; item_from_json( const JSON&amp; json )
{
  return json.type == normal
    ? std::make_unique&lt; NormalItem &gt;( json )
    : std::make_unique&lt; UpgradeableItem &gt;( json );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2490682</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2490682</guid><dc:creator><![CDATA[Torsten Robitzki]]></dc:creator><pubDate>Thu, 17 Mar 2016 09:51:53 GMT</pubDate></item></channel></rss>