<?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[Containerklasse mit polymorphen Objekten]]></title><description><![CDATA[<p>Hallo,</p>
<p>irgendwie stehe ich gerade auf'm Schlauch und komm nicht auf eine einfache Lösung. Ich brauche für mein Problem eine Containerklasse die polymorphe Objekte verwaltet. Jetzt frage ich mich, wie kriege ich diese Objekte möglichst anwenderfreundlich an den Container übergeben. Das beste was mir bisher eingefallen ist, ist die Arbeit mit Templates, ungefähr so:</p>
<pre><code class="language-cpp">class base{
protected:
    int element;
public:
    base(const int &amp;tt):element(tt){};
    virtual ~base(){};
    virtual void method()=0;
};

class derived1: public base{
public:
    derived1(const int &amp;tt):base(tt){};
    virtual ~derived1(){};
    void method(){
	cout&lt;&lt;&quot;Derived1 &quot;&lt;&lt;element&lt;&lt;endl;
    }
};

class derived2: public base{
public:
    derived2(const int &amp;tt):base(tt){};
    virtual ~derived2(){};
    void method(){
	cout&lt;&lt;&quot;Derived2 &quot;&lt;&lt;element&lt;&lt;endl;
    }
};

class container{
private:
    vector&lt;base*&gt; list;
public:
    ~container(){
	for (int i=0; i&lt;list.size();++i){
	    delete(list[i]);
	}	
    }

    template&lt;class T&gt; void add(const T&amp; bb){
	list.push_back(new T(bb));
    }

    void output(){
	for (int i=0; i&lt;list.size();++i){
	    (*list[i]).method();
	}
    }
};

int main(){
    container cont;
    cont.add&lt;derived1&gt;(derived1(1));
    cont.add&lt;derived2&gt;(derived2(2));
    cont.output();
}
</code></pre>
<p>(Ja, ich weiß. Ich habe hier die Regel der großen Drei nicht beachtet, aber ich wollte das Beispiel jetzt nicht unnötig aufblähen)</p>
<p>Das ganze kommt mir unnötig umständlich vor. Gibt es da eine Möglichkeit, dass der Nutzer des Containers einfach sowas wie</p>
<pre><code class="language-cpp">cont.add(derived1(1));
</code></pre>
<p>schreiben kann? Wenn die add-Methode statt eines Template-Parameters ein Element der Basisklasse erwartet, geht das ja nicht, weil diese abstrakt ist.</p>
<p>Ich habe schon daran gedacht, die add-Methode für alle abgeleiteten Klassen zu überschreiben, aber dies ist keine praktikable Lösung, weil der Nutzer später eigene abgeleitete Klassen implementieren können soll, ohne dafür am Code der Containerklasse rumzufummeln.<br />
Wie kann man dies geschickter machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/222233/containerklasse-mit-polymorphen-objekten</link><generator>RSS for Node</generator><lastBuildDate>Mon, 05 Oct 2026 06:54:55 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/222233.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Sep 2008 16:01:56 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Containerklasse mit polymorphen Objekten on Tue, 09 Sep 2008 16:01:56 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>irgendwie stehe ich gerade auf'm Schlauch und komm nicht auf eine einfache Lösung. Ich brauche für mein Problem eine Containerklasse die polymorphe Objekte verwaltet. Jetzt frage ich mich, wie kriege ich diese Objekte möglichst anwenderfreundlich an den Container übergeben. Das beste was mir bisher eingefallen ist, ist die Arbeit mit Templates, ungefähr so:</p>
<pre><code class="language-cpp">class base{
protected:
    int element;
public:
    base(const int &amp;tt):element(tt){};
    virtual ~base(){};
    virtual void method()=0;
};

class derived1: public base{
public:
    derived1(const int &amp;tt):base(tt){};
    virtual ~derived1(){};
    void method(){
	cout&lt;&lt;&quot;Derived1 &quot;&lt;&lt;element&lt;&lt;endl;
    }
};

class derived2: public base{
public:
    derived2(const int &amp;tt):base(tt){};
    virtual ~derived2(){};
    void method(){
	cout&lt;&lt;&quot;Derived2 &quot;&lt;&lt;element&lt;&lt;endl;
    }
};

class container{
private:
    vector&lt;base*&gt; list;
public:
    ~container(){
	for (int i=0; i&lt;list.size();++i){
	    delete(list[i]);
	}	
    }

    template&lt;class T&gt; void add(const T&amp; bb){
	list.push_back(new T(bb));
    }

    void output(){
	for (int i=0; i&lt;list.size();++i){
	    (*list[i]).method();
	}
    }
};

int main(){
    container cont;
    cont.add&lt;derived1&gt;(derived1(1));
    cont.add&lt;derived2&gt;(derived2(2));
    cont.output();
}
</code></pre>
<p>(Ja, ich weiß. Ich habe hier die Regel der großen Drei nicht beachtet, aber ich wollte das Beispiel jetzt nicht unnötig aufblähen)</p>
<p>Das ganze kommt mir unnötig umständlich vor. Gibt es da eine Möglichkeit, dass der Nutzer des Containers einfach sowas wie</p>
<pre><code class="language-cpp">cont.add(derived1(1));
</code></pre>
<p>schreiben kann? Wenn die add-Methode statt eines Template-Parameters ein Element der Basisklasse erwartet, geht das ja nicht, weil diese abstrakt ist.</p>
<p>Ich habe schon daran gedacht, die add-Methode für alle abgeleiteten Klassen zu überschreiben, aber dies ist keine praktikable Lösung, weil der Nutzer später eigene abgeleitete Klassen implementieren können soll, ohne dafür am Code der Containerklasse rumzufummeln.<br />
Wie kann man dies geschickter machen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579332</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579332</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 09 Sep 2008 16:01:56 GMT</pubDate></item><item><title><![CDATA[Reply to Containerklasse mit polymorphen Objekten on Tue, 09 Sep 2008 17:12:22 GMT]]></title><description><![CDATA[<p>was genau stoert dich an<br />
cont.push_back(new Foo());</p>
<p>?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579363</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Tue, 09 Sep 2008 17:12:22 GMT</pubDate></item><item><title><![CDATA[Reply to Containerklasse mit polymorphen Objekten on Tue, 09 Sep 2008 17:29:59 GMT]]></title><description><![CDATA[<p>Shade Of Mine schrieb:</p>
<blockquote>
<p>was genau stoert dich an<br />
cont.push_back(new Foo());</p>
<p>?</p>
</blockquote>
<p>Wenn ich den so übergebenen Zeiger direkt speichere könnte der Anwender das Objekt später löschen, obwohl es ja eigentlich private-Inhalt des Containers werden soll. Also müsste ich eine Kopie davon anlegen - aber welchen Konstruktor soll ich dann nehmen? Ich weiß ja nicht, was da übergeben wurde.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579371</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 09 Sep 2008 17:29:59 GMT</pubDate></item><item><title><![CDATA[Reply to Containerklasse mit polymorphen Objekten on Wed, 10 Sep 2008 00:03:20 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Wenn ich den so übergebenen Zeiger direkt speichere könnte der Anwender das Objekt später löschen, obwohl es ja eigentlich private-Inhalt des Containers werden soll. Also müsste ich eine Kopie davon anlegen - aber welchen Konstruktor soll ich dann nehmen? Ich weiß ja nicht, was da übergeben wurde.</p>
</blockquote>
<p>es ist auch moeglich ein<br />
std::vector&lt;Foo&gt; v;<br />
v.push_back(Foo());<br />
v[0].~Foo();</p>
<p>zu machen. Ist es deshalb sinnvoll dass v[0] eine Kopie zurueck gibt?</p>
<p>Wenn du einsiehst dass hier eine referenz einfach Sinn macht, dann wirst du feststellen dass es bei deinem zeiger beispiel nicht anders ist.</p>
<p>du kannst dich nie gegen jede dummheit schuetzen. das macht auch keinen sinn.</p>
<p>wenn du unbedingt diesen einen fehler verhindern willst (ein delete vec[0]; ist aber dennoch immernoch moeglich) dann musst du eine clone-System wie zB in Java implementieren. Das erste was du aber ueber clone in Java oder sonstwo hoerst ist: benutz es nur wenn es wirklich nicht anders geht und selbst dann meide es wenn irgend moeglich. (etwas ueber dramatisiert).</p>
<p>clone-Systeme sind fehleranfaellig und umstaendlich zu implementieren. die richtige variante ist es dem anwender des codes zu vertrauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579505</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579505</guid><dc:creator><![CDATA[Shade Of Mine]]></dc:creator><pubDate>Wed, 10 Sep 2008 00:03:20 GMT</pubDate></item><item><title><![CDATA[Reply to Containerklasse mit polymorphen Objekten on Wed, 10 Sep 2008 08:41:19 GMT]]></title><description><![CDATA[<p>Danke, deine Argumente haben mich überzeugt. So werde ich es dann machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1579586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1579586</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 10 Sep 2008 08:41:19 GMT</pubDate></item></channel></rss>