<?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[Frage bzg. template Funktionen]]></title><description><![CDATA[<p>Hi!<br />
Ich habe die 3 Klassen:</p>
<pre><code class="language-cpp">class base {...};
class derived1: public base {...};
class derived2: public base {...};
</code></pre>
<p>Sagen wir mal, dass ich eine Funktion habe:</p>
<pre><code class="language-cpp">void f() {...}
</code></pre>
<p>Die Implementation von f muss 1 bestimmtes Objekt erstellen vom Typ, abgeleitet von der Klasse base. So etwas:</p>
<pre><code class="language-cpp">void f() { base* = new derivedX; }
</code></pre>
<p>Wie kann ich das Typ &quot;derived&quot; als template der Funktion f übergeben?<br />
Ich möchte etwas wie f&lt;derived1&gt;() z.B. haben...</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/206205/frage-bzg-template-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Sat, 10 Oct 2026 06:56:59 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/206205.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 22 Feb 2008 07:13:24 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 07:13:24 GMT]]></title><description><![CDATA[<p>Hi!<br />
Ich habe die 3 Klassen:</p>
<pre><code class="language-cpp">class base {...};
class derived1: public base {...};
class derived2: public base {...};
</code></pre>
<p>Sagen wir mal, dass ich eine Funktion habe:</p>
<pre><code class="language-cpp">void f() {...}
</code></pre>
<p>Die Implementation von f muss 1 bestimmtes Objekt erstellen vom Typ, abgeleitet von der Klasse base. So etwas:</p>
<pre><code class="language-cpp">void f() { base* = new derivedX; }
</code></pre>
<p>Wie kann ich das Typ &quot;derived&quot; als template der Funktion f übergeben?<br />
Ich möchte etwas wie f&lt;derived1&gt;() z.B. haben...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460680</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Fri, 22 Feb 2008 07:13:24 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 07:57:40 GMT]]></title><description><![CDATA[<p>Zdravko schrieb:</p>
<blockquote>
<p>...<br />
Ich möchte etwas wie f&lt;derived1&gt;() z.B. haben...</p>
</blockquote>
<p>Dann mach das doch ! <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
<pre><code class="language-cpp">template &lt;typename T&gt;
T* f() { return new T; }
</code></pre>
<p>AAAABER: Das halte ich für designtechnisch für &quot;ungünstig&quot;.<br />
Spontan fällt mir ein:</p>
<ul>
<li>Wenn Du Konstuktoren mit unterschiedlichen Parametern hastm wird's lästig.</li>
<li>Wem &quot;gehört&quot; das erzeugte Objekt (= Wer soll das deleten) ? So eine &quot;Verantwortungsübergabe&quot; ist beliebte Fehlerquelle (irgendeiner löscht (nicht), wo er (nicht) soll).</li>
<li>Wozu eine eigene Funktion, wenn man doch sogar schon ein Schlüsselwort (new) dafür hat ? Kürzer wird's dadurch nicht und übersichtlicher auch nicht.</li>
<li>...</li>
</ul>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460706</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 Feb 2008 07:57:40 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 08:07:41 GMT]]></title><description><![CDATA[<p>Du hast mich falsch verstanden. Der template Parameter kann nicht beliebig sein, sondern er muss eine abgeleitete von base Klasse sein.<br />
Die Konstruktoren aller abgeleiteten Klasse haben die selben Parameter.<br />
Die Funktion erstellt ein Objekt und (mit Sicherheit!) löscht sie es egal was passiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460712</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460712</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Fri, 22 Feb 2008 08:07:41 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 08:14:31 GMT]]></title><description><![CDATA[<p>Zdravko schrieb:</p>
<blockquote>
<p>Du hast mich falsch verstanden. Der template Parameter kann nicht beliebig sein, sondern er muss eine abgeleitete von base Klasse sein.</p>
</blockquote>
<p>Wenn Du in der Funktion &quot;base* p = new T&quot; machst, wird sich der Compiler schon beschweren, wenn T* nicht in base* konvertiert werden kann (und das ist nur der Fall, wenn sie verwandt sind).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460715</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460715</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Fri, 22 Feb 2008 08:14:31 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 10:47:21 GMT]]></title><description><![CDATA[<p>Zdravko schrieb:</p>
<blockquote>
<p>Die Funktion erstellt ein Objekt und (<strong>mit Sicherheit!</strong>) löscht sie es egal was passiert.</p>
</blockquote>
<p>Zdravko schrieb:</p>
<blockquote>
<pre><code class="language-cpp">void f() { 
  base* = new derivedX; 
}
</code></pre>
</blockquote>
<p>Dir ist hoffentlich klar, dass &quot;mit Sicherheit gelöscht&quot; bei einem einfachen Pointer bedeutet, dass alle Operationen zwischen new und delete die &quot;nofail&quot;-Garatie bieten müssen, d.h. auf keinen Fall exceptions auslösen dürfen? Falls auch nur eine Operation eine Exception auslösen kann, solltest du besser einen shared_ptr&lt;base&gt; benutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460818</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460818</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 22 Feb 2008 10:47:21 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 10:51:25 GMT]]></title><description><![CDATA[<p>Zdravko schrieb:</p>
<blockquote>
<p>...<br />
Die Konstruktoren aller abgeleiteten Klasse haben die selben Parameter...</p>
</blockquote>
<p>Woher willst Du das wissen ?<br />
Bist Du der einzige, der jemals ableiten wird ?</p>
<p>Zdravko schrieb:</p>
<blockquote>
<p>...<br />
...Die Funktion erstellt ein Objekt und (mit Sicherheit!) löscht sie es egal was passiert.</p>
</blockquote>
<p>Wie löscht &quot;die Funktion&quot; denn das Objekt, wenn es nach ihrem Ablauf noch gültig sein soll ?</p>
<p>Aber ich habe den Eindruck, dass hier 2 Dinge zu klären sind:<br />
1.) &quot;Wie kann ich sicherstellen, dass eine (ein Funktionstemplate instantiierende) Klasse von einer bestimmten Basis abgeleitet ist ?&quot; und<br />
2.) &quot;Wann sind 'Erzeugerfunktionen' sinnvoll ?&quot;</p>
<p>Für Ersteres gibt es schon ein paar Dinge hier im Forum. Mein Einwand bezog sich im Wesentlichen auf die 2. Frage.<br />
(Natürlich gibt es &quot;Factorys&quot; und das ist auch gut so ... aber oftmals werden 'Erzeugerfunktionen' von Anfängern eingesetzt, weil es ihnen einfacher erscheint als der direkte Einsatz von new)</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460821</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460821</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Fri, 22 Feb 2008 10:51:25 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Fri, 22 Feb 2008 12:17:15 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Zdravko schrieb:</p>
<blockquote>
<p>Du hast mich falsch verstanden. Der template Parameter kann nicht beliebig sein, sondern er muss eine abgeleitete von base Klasse sein.</p>
</blockquote>
<p>Wenn Du in der Funktion &quot;base* p = new T&quot; machst, wird sich der Compiler schon beschweren, wenn T* nicht in base* konvertiert werden kann (und das ist nur der Fall, wenn sie verwandt sind).</p>
</blockquote>
<p>Aha, ok. Danke! Das wars.</p>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13624">@Simon2</a>, wer redet hier von 'Erzeugerfunktionen'? Wenn die Funktion f mit ungültiger Klasse instanziert wird, sprich nicht abgeleitet von base, oder der Konstruktor braucht andere Parameter, dann wird es einfach nicht kompiliert. So was nennt man &quot;Invarianz der Policy (auch Traits in C++)&quot;.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1460896</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1460896</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Fri, 22 Feb 2008 12:17:15 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Sat, 23 Feb 2008 19:53:20 GMT]]></title><description><![CDATA[<p>Zdravko schrieb:</p>
<blockquote>
<p>...wer redet hier von 'Erzeugerfunktionen'? ...</p>
</blockquote>
<p>Ich - sorry, mein Fehler. Ich habe oben falsch gelesen:</p>
<pre><code class="language-cpp">base* f() { return new derivedX; }
</code></pre>
<p>... das hattest Du aber weder geschrieben noch gemeint.<br />
=&gt; Ich nehme alles zurück und behaupte das Gegenteil.</p>
<p>Tut mir leid,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461680</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461680</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Sat, 23 Feb 2008 19:53:20 GMT</pubDate></item><item><title><![CDATA[Reply to Frage bzg. template Funktionen on Sat, 23 Feb 2008 19:56:33 GMT]]></title><description><![CDATA[<p>Ist schon ok. Jedem kann es passieren.<br />
Ich selbst finde meine Idee schon dumm.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1461681</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1461681</guid><dc:creator><![CDATA[khalderon]]></dc:creator><pubDate>Sat, 23 Feb 2008 19:56:33 GMT</pubDate></item></channel></rss>