<?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[Template Switch um abgeleitete Klasse zu erstellen]]></title><description><![CDATA[<p>Hallo, ich habe eine Basis-Klasse von der mehrere Klassen erben. Mit übergebenem Parameter soll eine andere Klasse angestoßen werden.<br />
Jetzt habe ich aber eine Template Klasse für die ich gerne lediglich für den Template-Parameter double ableiten will.</p>
<pre><code class="language-cpp">Switch_Algorithm&lt;double&gt; o_alg;
Basis_Klasse&lt;double&gt;* alg_ptr  = o_alg.Get_Algorithm(level);
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;	Basis_Klasse&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level)
{
	switch(level)
	{
		case 0:
			return new Klasse1&lt;T&gt;();
		case 1:
			return new Klasse2&lt;T&gt;();
		case 2:
                        reutrn new Klasse3&lt;double&gt;();
	}
	return NULL;
}
</code></pre>
<p>Leider klappt es so nicht.<br />
Ich versuche schon seit stunden irgendwie rumzumachen, ich wollte<br />
alle spezialisierungen angeben und nur für eine die BasisKlasse zurückgeben- das geht aber auch nicht wirklich:</p>
<pre><code class="language-cpp">template &lt;&gt; Basis_Klasse&lt;double&gt;*
Switch_Algorithm&lt;double&gt;::Get()
{
	return new Klasse3&lt;double&gt;();
}

template &lt;&gt; Basis_Klasse&lt;int&gt;*
Switch_Algorithm&lt;int&gt;::Get()
{
	return NULL;
}
</code></pre>
<p>Kann mir da jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/194642/template-switch-um-abgeleitete-klasse-zu-erstellen</link><generator>RSS for Node</generator><lastBuildDate>Tue, 29 Sep 2026 15:26:00 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/194642.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 09 Oct 2007 11:47:14 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 11:47:14 GMT]]></title><description><![CDATA[<p>Hallo, ich habe eine Basis-Klasse von der mehrere Klassen erben. Mit übergebenem Parameter soll eine andere Klasse angestoßen werden.<br />
Jetzt habe ich aber eine Template Klasse für die ich gerne lediglich für den Template-Parameter double ableiten will.</p>
<pre><code class="language-cpp">Switch_Algorithm&lt;double&gt; o_alg;
Basis_Klasse&lt;double&gt;* alg_ptr  = o_alg.Get_Algorithm(level);
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;	Basis_Klasse&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level)
{
	switch(level)
	{
		case 0:
			return new Klasse1&lt;T&gt;();
		case 1:
			return new Klasse2&lt;T&gt;();
		case 2:
                        reutrn new Klasse3&lt;double&gt;();
	}
	return NULL;
}
</code></pre>
<p>Leider klappt es so nicht.<br />
Ich versuche schon seit stunden irgendwie rumzumachen, ich wollte<br />
alle spezialisierungen angeben und nur für eine die BasisKlasse zurückgeben- das geht aber auch nicht wirklich:</p>
<pre><code class="language-cpp">template &lt;&gt; Basis_Klasse&lt;double&gt;*
Switch_Algorithm&lt;double&gt;::Get()
{
	return new Klasse3&lt;double&gt;();
}

template &lt;&gt; Basis_Klasse&lt;int&gt;*
Switch_Algorithm&lt;int&gt;::Get()
{
	return NULL;
}
</code></pre>
<p>Kann mir da jemand helfen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381189</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381189</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 11:47:14 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 11:55:57 GMT]]></title><description><![CDATA[<p>afaiko schrieb:</p>
<blockquote>
<p>...klappt es so nicht....geht aber auch nicht wirklich......<br />
Kann mir da jemand helfen?</p>
</blockquote>
<p>Mit einer Fehlerbeschreibung vielleicht.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381197</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381197</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Oct 2007 11:55:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 12:00:36 GMT]]></title><description><![CDATA[<p>Naja, ich dachte jemand hätte da nen ganz anderen goldenen weg.</p>
<p>Ich versuche es also so:</p>
<pre><code class="language-cpp">case 2:
   Klasse3&lt;double&gt;* a = NULL;
   Get(a);
</code></pre>
<pre><code class="language-cpp">template &lt;&gt; void
Switch_Algorithm&lt;double&gt;::Get(Basis_Klasse&lt;double&gt; * a)
{
	a = new Klasse3&lt;double&gt;();
}

// z.B int typ
template &lt;&gt; void
Switch_Algorithm&lt;int&gt;::Get(Basis_Klasse&lt;int&gt;* a)
{
}
</code></pre>
<p>die fehlermeldung lautet:</p>
<pre><code>Switch_Algorithm.cpp:35: Fehler: expected initializer before »&lt;« token
Switch_Algorithm.cpp:41: Fehler: expected initializer before »&lt;« token
</code></pre>
<p>Danke</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381200</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381200</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 12:00:36 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 12:49:37 GMT]]></title><description><![CDATA[<p>Mal abgesehen davon, dass das mit dem Pointer-Argument so nicht klappen kann (wenn schon, dann &quot;Basis_Klasse&lt;double&gt; *<strong>&amp;</strong>&quot;), sieht mir das eher nach einem Problem Deiner Deklarationsreihenfolge aus: Vermutlich kennt der Compiler an der Stelle, an der er Klasse3 braucht, diese noch nicht.</p>
<p>Für welche Codezeile meldet er denn den Fehler ? (Bitte jetzt nicht &quot;Zeile 35&quot; antworten, soviel Zeilen hat nämlich Dein Beispiel gar nicht <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>
<p>Verkürze Deinen Sourcecode doch einfach mal so, dass der Fehler noch produziert wird, aber NICHTs drinsteht, was nicht zur Sache gehört.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381249</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381249</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Oct 2007 12:49:37 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 13:10:25 GMT]]></title><description><![CDATA[<p>Danke für die Geduld.</p>
<p>Leider ist das verkürzen des quellcodes nicht so ohne weiteres möglich. Also ich nehme an du möchtest ein lauffähiges programm oder?</p>
<p>Der Fehler kommt in diesen Zeilen:</p>
<pre><code class="language-cpp">Switch_Algorithm&lt;double&gt;::Get(Basis_Klasse&lt;double&gt;*&amp; a)

Switch_Algorithm&lt;int&gt;::Get(Basis_Klasse&lt;int&gt;*&amp; a)
</code></pre>
<blockquote>
<p>Vermutlich kennt der Compiler an der Stelle, an der er Klasse3 braucht, diese noch nicht.</p>
</blockquote>
<p>Doch die kennt er. Denn wenn ich es für allgemeine Typen schreibe funktioniert alles:</p>
<pre><code class="language-cpp">template &lt;class T&gt;	Basis_Klasse&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level)
{
	switch(level)
	{
		case 0:
			return new Klasse1&lt;T&gt;();
		case 1:
			return new Klasse2&lt;T&gt;();
		case 2:
                        return new Klasse3&lt;T&gt;();
		// no default case
	}
	return NULL;
}
</code></pre>
<p>Was ich machen möchte ist: Klasse 3 ist eine template basierte Klasse die ja von der template-basierte Basis-Klasse erbt. Allerdings soll für den case 2: nur der typ double &quot;gemacht&quot; werden.</p>
<p>Da ja Klasse3 von der Basisklasse erbt, muss doch Klasse3 auch template-basiert sein oder?</p>
<p>Vielleicht gibt es auch einen anderen Weg als so wie oben?</p>
<p>Also ich versuche nochmal den code so zu reduzieren dass ihr mich vielleicht besser versteht:</p>
<p>IN DER MAIN.</p>
<pre><code class="language-cpp">Switch_Algorithm&lt;double&gt; o_alg;
Basis_Klasse&lt;double&gt;* alg_ptr  = o_alg.Get_Algorithm(level);

// oder auch so z.B:
Switch_Algorithm&lt;int&gt; o_alg;
Basis_Klasse&lt;int&gt;* alg_ptr  = o_alg.Get_Algorithm(level);
</code></pre>
<p>SWITCH</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Switch_Algorithm
{
	public:

		Basis_Klasse&lt;T&gt;* Get_Algorithm(const int level);

		void Get(Basis_Klasse&lt;double&gt;*&amp; a);
		void Get(Basis_Klasse&lt;int&gt;*&amp; a);
};
</code></pre>
<pre><code class="language-cpp">template &lt;class T&gt;	Basis_Klasse&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level)
{
	switch(level)
	{
		case 0:
			return new Klasse1&lt;T&gt;();
		case 1:
			return new Klasse2&lt;T&gt;();
		case 2:

			Basis_Klasse&lt;T&gt;* a = NULL;
			Get(a); 
			return a;
	}
}
</code></pre>
<pre><code class="language-cpp">template &lt;&gt; void
Switch_Algorithm&lt;double&gt;::Get(Basis_Klasse&lt;double&gt;*&amp; a)
{
	a = new Klasse3&lt;double&gt;();
}

template &lt;&gt; void
Switch_Algorithm&lt;int&gt;::Get(Basis_Klasse&lt;int&gt;*&amp; a)
{
	a = NULL;
}
</code></pre>
<p>DIE BASISKLASSE:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Basis_Klasse
{

	public:

		// Destructor
		virtual 	~Basis_Klasse&lt;T&gt;(){ }
};
</code></pre>
<p>UND EINMAL DIE KLASSE3 - sie ist wie auch Klasse 2 und klasse 1 gleich:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Klasse2 : public Basis_Klasse&lt;T&gt;
{
	public:
};
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1381271</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381271</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 13:10:25 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 14:09:57 GMT]]></title><description><![CDATA[<p>afaiko schrieb:</p>
<blockquote>
<p>....<br />
Der Fehler kommt in diesen Zeilen:</p>
<pre><code class="language-cpp">Switch_Algorithm&lt;double&gt;::Get(Basis_Klasse&lt;double&gt;*&amp; a)

Switch_Algorithm&lt;int&gt;::Get(Basis_Klasse&lt;int&gt;*&amp; a)
</code></pre>
<p>...</p>
</blockquote>
<p>Was für mich danach aussieht, als würde er da Basis_Klasse nicht kennen... (war die andere Möglichkeit - hatte eine 50/50-Chance verbockt <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>
<p>Hast Du auch schon alle templates im Header implementiert ?</p>
<p>Bei mir compiliert jedenfalls Folgendes problemlos (abgesehen von einer &quot;unused variable&quot;-Warning bzgl. alg_ptr) :</p>
<pre><code class="language-cpp">// header.h
template &lt;typename T&gt;
struct Basis_Klasse {
   virtual ~Basis_Klasse(){ }
};    

template &lt;typename T&gt;
struct Klasse1 : public Basis_Klasse&lt;T&gt; {
   virtual void f() {}
};    

template &lt;typename T&gt;
struct Klasse2 : public Basis_Klasse&lt;T&gt; {
   virtual void g() {}
};    

template &lt;typename T&gt;
struct Klasse3 : public Basis_Klasse&lt;T&gt; {
   virtual void h() {}
};    

template &lt;typename T&gt;
struct Switch_Algorithm {
        Basis_Klasse&lt;T&gt;* Get_Algorithm(const int level);
        void Get(Basis_Klasse&lt;T&gt;*&amp; a);
};    

template &lt;typename T&gt;
Basis_Klasse&lt;T&gt;*  Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level){
   Basis_Klasse&lt;T&gt;* a = 0;
    switch(level) {
        case 0: a = new Klasse1&lt;T&gt;(); break;
        case 1: a = new Klasse2&lt;T&gt;(); break;
        case 2: Get(a); break;
    }
    return a;
}
</code></pre>
<pre><code class="language-cpp">// main.cpp
#include &quot;header.h&quot;

template &lt;&gt;
void Switch_Algorithm&lt;int&gt;::Get(Basis_Klasse&lt;int&gt;*&amp; a) {
    a = 0;
}  
template &lt;&gt;
void Switch_Algorithm&lt;double&gt;::Get(Basis_Klasse&lt;double&gt;*&amp; a) {
    a = new Klasse3&lt;double&gt;();
}

int main (int argc, char **argv) {
   Switch_Algorithm&lt;int&gt; o_alg;
   Basis_Klasse&lt;int&gt;* alg_ptr  = o_alg.Get_Algorithm(2);
   return 0;
}
</code></pre>
<p>... was nicht bedeutet, dass ich das Design gutheiße - ich finde allein schon diese &quot;implizite Typdefinition mittels level&quot; bedenklich.</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381283</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381283</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Oct 2007 14:09:57 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 14:07:49 GMT]]></title><description><![CDATA[<p>Hallo Simon,</p>
<p>ja alles templates sind im Header implementiert. Wie gesagt - wenn ich es als Templatebasierten Parameter T setze geht ja alles.</p>
<p>Wie wird denn das üblicherweise gemacht wenn man nur eine spezialisierung haben wollen würde?</p>
<p>Gruß</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381340</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381340</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 14:07:49 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 14:09:29 GMT]]></title><description><![CDATA[<p>Hmm....zum design.</p>
<p>Wie mache ich es denn sonst wenn ich abhängig von einem parameter unterschiedliche Abgeleitete Klassen haben möchte?<br />
Ich bin für andere Vorschläge immer gern zu haben!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381342</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 14:09:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 14:23:22 GMT]]></title><description><![CDATA[<p>Also als Erstes mal sollte man IMHO diese &quot;Pointerrückgabe&quot; möglichst vermeiden.<br />
Bei einem zurückgegebene Pointer ist nicht klar, wem das dahinterligende Objekt gehört (sprich: wer ihn löscht). Dazu müsste der Nutzer von Switch_Algorithm den Source kennen und bei der nächsten Version kann das alles schon wieder anders sein.<br />
Dem könnte man entweder durch boost::smart_pointer beikommen oder gleich die Ressource kapseln (irgendwer will ja etwas mit dem Objekt machen: Dann soll dem das auch gehören und er aufräumen).</p>
<p>Ich schau mal, ob ich ein Beispiel bastele...</p>
<p>Gruß,</p>
<p>Simon2.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381363</guid><dc:creator><![CDATA[Simon2]]></dc:creator><pubDate>Tue, 09 Oct 2007 14:23:22 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 14:38:29 GMT]]></title><description><![CDATA[<p>Danke Simon - das wäre Klasse wenn Du mir ein beispiel schreiben könntest.<br />
Wenns geht ohne Boost...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381385</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381385</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 14:38:29 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 18:27:43 GMT]]></title><description><![CDATA[<p>So ne ähnliche Frage gab's kürzlich schon mal, vielleicht findest du in dem alten Thread irgendeine Anregung: <a href="http://c-plusplus.net/forum/viewtopic-var-t-is-194257.html" rel="nofollow">http://c-plusplus.net/forum/viewtopic-var-t-is-194257.html</a> <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1381539</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381539</guid><dc:creator><![CDATA[finix]]></dc:creator><pubDate>Tue, 09 Oct 2007 18:27:43 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 19:20:26 GMT]]></title><description><![CDATA[<p>Tatsache - da gehts ja richtig rund ...<br />
also so wie ich das aus dem Thread herauslesen kann wird das also doch so in der Art gemacht mit dieser Unterscheidung? Zumindest fällt mir so nichts anderes ein. Und um jetzt zu meinem Problem zurückzukommen: Wie sollte man dann eine Template-Spezialisierung in so einem Template-basierten switch einbauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381573</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381573</guid><dc:creator><![CDATA[afaiko]]></dc:creator><pubDate>Tue, 09 Oct 2007 19:20:26 GMT</pubDate></item><item><title><![CDATA[Reply to Template Switch um abgeleitete Klasse zu erstellen on Tue, 09 Oct 2007 20:36:27 GMT]]></title><description><![CDATA[<p>In deinem Beispiel muss die zurückgegebene Basis_Klasse mit dem selben Typ parametrisiert werden, wie die Switch_Algorithm-Klasse, da sie die gleiche Typvariable haben:</p>
<pre><code class="language-cpp">template &lt;class T&gt;    
Basis_Klasse&lt;T&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level) { ... }
</code></pre>
<p>Wenn du Basis_Klasse mit einem anderen Typ parametrisieren willst, musst du eine andere Typvariable verwenden, zB. mit einer Template-Memberfunktion:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
template &lt;class R&gt;
Basis_Klasse&lt;R&gt;*
Switch_Algorithm&lt;T&gt;::Get_Algorithm(const int level) {
    switch (level) {
    case 0: return new Klasse1&lt;T&gt;;
    case 1: return new Klasse2&lt;T&gt;;
    case 2: return new Klasse3&lt;double&gt;;
    }
}
</code></pre>
<p>Dann musst du R aber beim Aufruf mit angeben:</p>
<pre><code class="language-cpp">Basis_Klasse&lt;int&gt;* pMyObj-&gt;Get_Algorithm&lt;int&gt;(mylevel);
</code></pre>
<p>Nicht nur, dass das unschön ist, R und level hängen voneinander ab. Besser ist es, wenn deine Basis_Klasse keine Template-Klasse ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1381618</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1381618</guid><dc:creator><![CDATA[deha]]></dc:creator><pubDate>Tue, 09 Oct 2007 20:36:27 GMT</pubDate></item></channel></rss>