<?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[Je nach Eingabe unterschiedliche Objekte erstellen]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Struktur:</p>
<pre><code class="language-cpp">class Base
{...};

class Derived1 : public Base
{...};

...

class DerivedN : public Base
{...};
</code></pre>
<p>Angenommen ich möchte nach Eingabe einer Zahl i die Klasse Derivedi instanziieren. * Geht das elegant ohne sowas wie ein switch-statement?</p>
<p>Bye.</p>
<p>----<br />
* Das Beispiel ist natürlich stark vereinfacht</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/271602/je-nach-eingabe-unterschiedliche-objekte-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 29 Aug 2026 11:19:07 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/271602.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 31 Jul 2010 17:28:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Je nach Eingabe unterschiedliche Objekte erstellen on Sat, 31 Jul 2010 17:28:30 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe folgende Struktur:</p>
<pre><code class="language-cpp">class Base
{...};

class Derived1 : public Base
{...};

...

class DerivedN : public Base
{...};
</code></pre>
<p>Angenommen ich möchte nach Eingabe einer Zahl i die Klasse Derivedi instanziieren. * Geht das elegant ohne sowas wie ein switch-statement?</p>
<p>Bye.</p>
<p>----<br />
* Das Beispiel ist natürlich stark vereinfacht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934493</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934493</guid><dc:creator><![CDATA[Ingrid Löffler]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:28:30 GMT</pubDate></item><item><title><![CDATA[Reply to Je nach Eingabe unterschiedliche Objekte erstellen on Sat, 31 Jul 2010 17:49:20 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">std::map&lt;int, factoryMethod&gt;
</code></pre>
<p>Nun brauchst du nur noch<br />
<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="😉"
    /> deine Factory-Methoden erstellen<br />
<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="😉"
    /> diese (Methodenzeiger) in der map zum passenden &quot;i&quot; einfügen</p>
<p>// edit:<br />
Hier ein kleines Beispiel:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;map&gt;
using namespace std;

struct Base {
    virtual void print() const {
        cout &lt;&lt; &quot;Base&quot; &lt;&lt; endl;
    }
};
Base* createBase() {
    return new Base;
}

struct Der1 : public Base {
    void print() const {
        cout &lt;&lt; &quot;Derived 1&quot; &lt;&lt; endl;
    }
};
Base* createDer1() {
    return new Der1;
}

struct Der2 : public Base {
    void print() const {
        cout &lt;&lt; &quot;Derived 2&quot; &lt;&lt; endl;
    }
};
Base* createDer2() {
    return new Der2;
}

typedef Base* (*factory)();
typedef std::map&lt;int, factory&gt; FactoryMap;

int main() {
    FactoryMap map;
    map[0]=createBase;
    map[1]=createDer1;
    map[2]=createDer2;

    Base* b = map[0]();
    b-&gt;print();
    delete b;
    b = map[1]();
    b-&gt;print();
    delete b;
    b = map[2]();
    b-&gt;print();
    delete b;
}
</code></pre>
<p>Sollte am Ende kein Integer, sondern ein string als key verwendet werden (ist ja auch was schönes), dann nimm etwas, das einen vernünftigen operator== hat. std::string ist gut, const char* weniger <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/1934497</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934497</guid><dc:creator><![CDATA[l&#x27;abra d&#x27;or]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:49:20 GMT</pubDate></item><item><title><![CDATA[Reply to Je nach Eingabe unterschiedliche Objekte erstellen on Sat, 31 Jul 2010 17:50:24 GMT]]></title><description><![CDATA[<p>Wege gibt es da viele. Zum Beispiel Funktionszeiger.<br />
Aber da viele sich vor Base*(*tabelle[])() fürchten, werden auch gerne Hilfsklassen gebastelt, wobei jede Hilfsklasse ein Hauptklassenobjekt erzeugen kann mit ihrer virtuellen Funktion und in der Tabelle stehen Hilfsbasisklassenzeiger.</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

struct Base{
	virtual void test()=0;
};
struct Derived1:public Base{
	void test(){
		cout&lt;&lt;&quot;Derived1\n&quot;;
	}
};
struct Derived2:public Base{
	void test(){
		cout&lt;&lt;&quot;Derived2\n&quot;;
	}
};
struct Derived3:public Base{
	void test(){
		cout&lt;&lt;&quot;Derived3\n&quot;;
	}
};

Base* make1(){
  return new Derived1;
}
Base* make2(){
  return new Derived2;
}
Base* make3(){
  return new Derived3;
}
Base*(*tabelle[])()={0,make1,make2,make3};

int main(){
	cout&lt;&lt;&quot;Gibstu Zahl ein uzwischen 1 und 3: &quot;;
	int i;
	cin&gt;&gt;i;
	if(i&gt;=1 &amp;&amp; i&lt;=3){
		Base* b=tabelle[i]();
		b-&gt;test();
	}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1934500</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934500</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:50:24 GMT</pubDate></item><item><title><![CDATA[Reply to Je nach Eingabe unterschiedliche Objekte erstellen on Sat, 31 Jul 2010 17:57:35 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>danke an euch beide. Ich sehe nun dass ich die C++-Beschränkung, keine Typen in einer Variablen speichern zu können in diesem Fall durch das Speichern von Funktionszeigern umgehen kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1934507</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1934507</guid><dc:creator><![CDATA[Ingrid Löffler]]></dc:creator><pubDate>Sat, 31 Jul 2010 17:57:35 GMT</pubDate></item></channel></rss>