<?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[Templates (und eigene Container-Klasse inside)]]></title><description><![CDATA[<pre><code class="language-cpp">class ListenElement{
	private:
		T* item;
		ListenElement* next; 
	public:
		ListenElement();
		friend class Liste;
};

class Liste{
	private:
		ListenElement* first;
		ListenElement* current;
	public:
		Liste();
		bool add(T*); //fügt neues Listenelement hinzu; T* wird in main() erzeugt
		bool remove();//löscht das Element aus der Liste, auf das current zeigt
		void begin(); //setzt current auf den Listenanfang(current=first)
		void next();  //setzt current auf das nächste Listenelement(current=current-&gt;next) 
		T* getItem(); //liefert Pointer vom Typ T* von current-&gt;item
};
</code></pre>
<p>Hallo!</p>
<p>Oben habe ich eine verkettete Liste. Nun möchste ich natürlich, dass ich jedes beliebige von mir erzeugte Element in diese Liste einfügen kann.<br />
Also müssen Tamplates ranhalten.<br />
Die Frage ist nun, ob ich nur die Klasse ListenElement als Tamplate deklarieren kann, denn manche Funktionen aus Klasse Liste greiffen ja direkt auf T* aus ListenElement zu? Ich möchte nämlich nicht für jedes jeweilige Element eine neue Liste erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/241367/templates-und-eigene-container-klasse-inside</link><generator>RSS for Node</generator><lastBuildDate>Mon, 21 Sep 2026 13:29:03 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/241367.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 19 May 2009 17:26:57 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 17:26:57 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">class ListenElement{
	private:
		T* item;
		ListenElement* next; 
	public:
		ListenElement();
		friend class Liste;
};

class Liste{
	private:
		ListenElement* first;
		ListenElement* current;
	public:
		Liste();
		bool add(T*); //fügt neues Listenelement hinzu; T* wird in main() erzeugt
		bool remove();//löscht das Element aus der Liste, auf das current zeigt
		void begin(); //setzt current auf den Listenanfang(current=first)
		void next();  //setzt current auf das nächste Listenelement(current=current-&gt;next) 
		T* getItem(); //liefert Pointer vom Typ T* von current-&gt;item
};
</code></pre>
<p>Hallo!</p>
<p>Oben habe ich eine verkettete Liste. Nun möchste ich natürlich, dass ich jedes beliebige von mir erzeugte Element in diese Liste einfügen kann.<br />
Also müssen Tamplates ranhalten.<br />
Die Frage ist nun, ob ich nur die Klasse ListenElement als Tamplate deklarieren kann, denn manche Funktionen aus Klasse Liste greiffen ja direkt auf T* aus ListenElement zu? Ich möchte nämlich nicht für jedes jeweilige Element eine neue Liste erstellen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712905</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712905</guid><dc:creator><![CDATA[katzenmann]]></dc:creator><pubDate>Tue, 19 May 2009 17:26:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 17:58:01 GMT]]></title><description><![CDATA[<p>katzenmann schrieb:</p>
<blockquote>
<p>Die Frage ist nun, ob ich nur die Klasse ListenElement als Tamplate deklarieren kann, denn manche Funktionen aus Klasse Liste greiffen ja direkt auf T* aus ListenElement zu?</p>
</blockquote>
<p>Wie meinst du, manche Funktionen greifen direkt auf <code>T*</code> zu? Sind sie von der jeweiligen Implementierung des verwendeten Typen abhängig?</p>
<p>Falls ja, hast du etwas falsch designt. Ein Container hat nur die Aufgabe, mehrere Objekte gleichen Typs komfortabel und effizient zu verwalten. Er muss nichts über den Datentypen seiner Elemente wissen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712919</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712919</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 May 2009 17:58:01 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:04:58 GMT]]></title><description><![CDATA[<p>Nö, eigentlich funktioniert die Liste völlig unabhängig von ihren Elementen.<br />
Aber mein Verständnis von Templates ist nicht gerade überragend.</p>
<p>So sieht zB meine Fkt. add(T*) aus:</p>
<pre><code class="language-cpp">bool Liste::add(T *element){
	ListenElement *tmp = new ListenElement();
	if(tmp == NULL)
		return false;
	tmp-&gt;item = element;

	if(first == NULL){
		first = tmp;
		return true;
	}
	else{
		tmp-&gt;next = first-&gt;next;
		first-&gt;next = tmp;
		return true;
	}
	return false;
}
</code></pre>
<p>Ich komm nicht so ganz dahinter, wie es mit den Templates funktionieren soll, wenn nur die Klasse ListenElement als Template deklariert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712925</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712925</guid><dc:creator><![CDATA[katzenmann]]></dc:creator><pubDate>Tue, 19 May 2009 18:04:58 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:21:02 GMT]]></title><description><![CDATA[<p>Beide Klassen müssen als Klassentemplates deklariert werden, damit sie mit beliebigen <code>T</code> s kompatibel sind. Zu Templates gibt es im Magazin dieses Forums einen <a href="http://magazin.c-plusplus.net/artikel/Einf%FChrung%20in%20die%20Programmierung%20mit%20Templates" rel="nofollow">guten Artikel</a>, ich würde mir den mal anschauen.</p>
<p>Ein paar Hinweise zu deinem Code:</p>
<pre><code class="language-cpp">// Wieso Rückgabetyp bool? Was kann schiefgehen? Fragst du den Rückgabewert
// beim Aufruf auch ab? Wenn überhaupt, wären wohl Exceptions eher angebracht.
bool Liste::add(T *element){ // Warum T* als Parameter -&gt; eher const T&amp;
    ListenElement *tmp = new ListenElement(); 

    // Die folgende Abfrage bringt überhaupt nichts, da new im Fehlerfall 
    // eine Exception wirft und nicht einen Nullzeiger zurückgibt.
    if(tmp == NULL) 
        return false; 

    // Du speicherst den übergebenen Zeiger direkt in die Liste? Möchtest du nicht,
    // dass die Elemente kopiert werden und in der Liste autonom verwaltet werden?
    tmp-&gt;item = element; 

    if(first == NULL){ 
        first = tmp; 
        return true; // wie gesagt fragwürdig
    } 
    else{ 
        // Wäre das neue Element nicht so einzufügen, dass es danach an erster Stelle (oder
        // an letzter) steht? Aber die zweite Stelle scheint mir merkwürdig...
        tmp-&gt;next = first-&gt;next; 
        first-&gt;next = tmp; 
        return true; // ebenfalls fragwürdig
    } 

    // Wann soll der folgende Code deiner Ansicht nach ausgeführt werden?
    return false; // aber da eh fragwürdig, einfach weglassen ;)
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1712934</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712934</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 May 2009 18:21:02 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:21:31 GMT]]></title><description><![CDATA[<p>Die Memberfunktionen müssen dann natürlich auch Template-Funktionen sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712936</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712936</guid><dc:creator><![CDATA[Braunstein]]></dc:creator><pubDate>Tue, 19 May 2009 18:21:31 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 19:39:57 GMT]]></title><description><![CDATA[<p>...für Nexus <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1712937</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712937</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 19 May 2009 19:39:57 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:25:47 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Mehr brauchst du nicht um eine funktionierende Liste handzuhaben. Bei dir siehts nämlich ein wenig komisch aus.</p>
</blockquote>
<p>Doch, es braucht mehr, wenn die Liste nützlich sein soll. Und komisch sieht es eher bei dir aus. Eine verkettete Liste unterstützt normalerweise keinen <code>operator[]</code> . katzenmann hingegen hat in seinem Code bereits einen Iterator-ähnlichen Ansatz. Und dafür, dass er das Iterator-Konzept wahrscheinlich nicht kennt, ist das bereits recht intelligent.</p>
<p>Und mehr braucht man natürlich, mindestens einen Destruktor, Kopierkonstruktor und Zuweisungsoperator. Aber wenn die Liste auch brauchbar sein soll, kommen noch Funktionen zur Löschung, Leerung, Einfügung und Grössenabfrage hinzu. Aber das nur nebenbei.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712941</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712941</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 May 2009 18:25:47 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:29:26 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Hatte es mir selbst nochmal durchgelesen und es editiert <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1712944</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712944</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 19 May 2009 18:29:26 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 18:36:02 GMT]]></title><description><![CDATA[<p>Trotzdem bleibt dein <code>operator[]</code> ein schlechter Vorschlag. Zudem verbreitest du weiterhin Unwahrheiten.</p>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>eig. nutzt man dafür keine 2 Klassen</p>
</blockquote>
<p>In den meisten Listen-Implementierungen gibt es eine Klasse für ein Listenelement. Wie willst du sonst sinnvoll Zeiger auf andere Elemente speichern?</p>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>und wenn, dann steckt man meistens die eine in die andere.</p>
</blockquote>
<p>Auch das muss nicht sein. Ist vielleicht nützlich wegen Information Hiding, aber ist nicht nötig. Für katzenmann ist es wohl eher verwirrend im Moment.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712946</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712946</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 May 2009 18:36:02 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 19:44:40 GMT]]></title><description><![CDATA[<p>Nexus schrieb:</p>
<blockquote>
<p>...</p>
</blockquote>
<p>Meiner Meinung nach gehst du nach einem Sonderfall. Ich hab bisher die Listen meistens so in dem Prinzip gesehen. Wofür soll ich eine Klasse erstellen, wo auch eine Struktur langt. Außerdem, warum soll ich die Struktur nicht in die Klasse machen, wenn nicht noch eine andere Klasse auf die Struktur zugreift? Daher kann ich sie private in die Klasse machen...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1712971</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712971</guid><dc:creator><![CDATA[freaky]]></dc:creator><pubDate>Tue, 19 May 2009 19:44:40 GMT</pubDate></item><item><title><![CDATA[Reply to Templates (und eigene Container-Klasse inside) on Tue, 19 May 2009 20:01:11 GMT]]></title><description><![CDATA[<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Wofür soll ich eine Klasse erstellen, wo auch eine Struktur langt.</p>
</blockquote>
<p>Strukturen <em>sind</em> Klassen. Davon bin ich ausgegangen, als ich deinen Post gelesen habe.</p>
<p>FreakY&lt;3Cpp schrieb:</p>
<blockquote>
<p>Außerdem, warum soll ich die Struktur nicht in die Klasse machen, wenn nicht noch eine andere Klasse auf die Struktur zugreift? Daher kann ich sie private in die Klasse machen...</p>
</blockquote>
<p>Du weisst ja nicht, ob keine andere Klasse diese verwendet. Okay, es ist hier anzunehmen, später wäre es wohl auch zu empfehlen, da stimme ich dir zu. Aber wie angetönt scheint mir, als ob katzenmann zuerst noch Wichtigeres zu tun hätte. <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/1712987</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1712987</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Tue, 19 May 2009 20:01:11 GMT</pubDate></item></channel></rss>