<?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[Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ?]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klassenstruktur</p>
<p>Vater -&gt; Kind1<br />
Vater -&gt; Kind2</p>
<p>die Kinder haben eine GetFunktion die ein Objekt einer Klasse zurückgeben</p>
<pre><code class="language-cpp">RetKlasse1 Kind1::getValue();
RetKlasse2 Kind2::getValue();
</code></pre>
<p>ich hätte dies gern verallgemeinert,<br />
und würde gern in der BasisKlasse eine Funktion deklarieren, die dies beschreibt.</p>
<p>Zusätzlich würde ich gern ein Objekt zurückgeben und nicht einen Zeiger.</p>
<p>Also eine Lösung wie</p>
<pre><code class="language-cpp">void * Vater::getValue()
</code></pre>
<p>wäre mir nicht so lieb,<br />
es sei denn ihr überzeugt mich vom Gegenteil.<br />
Ich würde mir gern irgendwelche Speicherlöcher ersparen, daher normale Objekterzeugung.</p>
<p>Danke für Tips ?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/251753/lösungsvorschlag-gesucht-ist-hier-ein-template-zu-verwenden</link><generator>RSS for Node</generator><lastBuildDate>Tue, 15 Sep 2026 09:23:04 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/251753.rss" rel="self" type="application/rss+xml"/><pubDate>Fri, 09 Oct 2009 18:40:19 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ? on Fri, 09 Oct 2009 18:41:08 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>ich habe eine Klassenstruktur</p>
<p>Vater -&gt; Kind1<br />
Vater -&gt; Kind2</p>
<p>die Kinder haben eine GetFunktion die ein Objekt einer Klasse zurückgeben</p>
<pre><code class="language-cpp">RetKlasse1 Kind1::getValue();
RetKlasse2 Kind2::getValue();
</code></pre>
<p>ich hätte dies gern verallgemeinert,<br />
und würde gern in der BasisKlasse eine Funktion deklarieren, die dies beschreibt.</p>
<p>Zusätzlich würde ich gern ein Objekt zurückgeben und nicht einen Zeiger.</p>
<p>Also eine Lösung wie</p>
<pre><code class="language-cpp">void * Vater::getValue()
</code></pre>
<p>wäre mir nicht so lieb,<br />
es sei denn ihr überzeugt mich vom Gegenteil.<br />
Ich würde mir gern irgendwelche Speicherlöcher ersparen, daher normale Objekterzeugung.</p>
<p>Danke für Tips ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790328</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790328</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Fri, 09 Oct 2009 18:41:08 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ? on Fri, 09 Oct 2009 19:15:31 GMT]]></title><description><![CDATA[<p>Mach doch für den Rückgabetyp eine Basisklasse.</p>
<pre><code class="language-cpp">class RetBase
{
public:
   //.. Operationen auf abgeleitete Klassen
  ~RetBase (){}
};

class RetKlasse1 : public RetBase
{
 //..
};

class RetKlasse2 : public RetBase
{
 //..
};

class Kind
{
 public:
  RetBase* getValue();
};
</code></pre>
<p>Dann hast du eine saubere Schnittstelle für die Ret-Klassen, die du dann um die Funktionalitäten halt noch erweitern musst.ζ</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790350</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 09 Oct 2009 19:15:31 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ? on Fri, 09 Oct 2009 19:22:12 GMT]]></title><description><![CDATA[<p>Danke Dir für den Tip, das ist eine Idee,<br />
nur leider sind die Rückgabeklassen nicht von mir und eine Gemeinsame Schnittstelle/Vererbungshirarchie gibt es dort noch nicht.</p>
<p>Könnte man elegant irgendwie eine erzeugen ?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790356</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790356</guid><dc:creator><![CDATA[MBreuer]]></dc:creator><pubDate>Fri, 09 Oct 2009 19:22:12 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ? on Fri, 09 Oct 2009 19:34:14 GMT]]></title><description><![CDATA[<p>Also wenn du die Klassen bearbeiten darfst, dann könntest du schon eine Hierarchie einbauen, aber von bereits bestehenden System rumzubasteln halte ich für heikel. Natürlich könntest du das ganze minimal machen und einfach von der gezeigten Klasse erben. Das sollte bereits gehen. Allerdings wirst du dann Probleme mit der Funktionalität der abgeleitenden Klassen haben (sofern die nicht zufälligerweise auf Polymorphie passen..).</p>
<p>Mit der Basisklasse kämst du auch um void Zeiger herum, aber du müsstest halt immernoch die Basisklassen Zeiger casten + noch irgendwie herausfinden können, welches Objekt denn jetzt überhaupt referenziert. (Was ja eigl. gegen den Sinn von Polymorphie ist, aber imo besser als void*).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790370</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790370</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Fri, 09 Oct 2009 19:34:14 GMT</pubDate></item><item><title><![CDATA[Reply to Lösungsvorschlag gesucht: Ist hier ein Template zu verwenden ? on Fri, 09 Oct 2009 19:42:44 GMT]]></title><description><![CDATA[<p>Grundsätzlich sind Funktionstemplates eine Möglichkeit. Für die Verallgemeinerung müsstest du irgendwo den Rückgabetypen speichern. Entweder als <code>typedef</code> in den Klassen selbst, oder ausserhalb, z.B. in einem Traits-Template wie hier <code>return_type</code> .</p>
<pre><code class="language-cpp">template &lt;typename Class&gt;
typename return_type&lt;Class&gt;::type getValue(const Class&amp; obj)
{
    return obj.getValue();
}
</code></pre>
<p>Die Traitsklasse könnte so aussehen (besseren Namen als <code>return_type</code> wählen):</p>
<pre><code class="language-cpp">// Allgemeiner Fall, entweder nichts oder einen Default-Typ definieren
template &lt;typename T&gt;
struct return_type
{
    typedef T type; // Default-Typ
};

// Templatespezialisierung für konkreten Rückgabetypen
template &lt;&gt;
struct return_type&lt;Kind1&gt;
{
    typedef Ret1 type; // konkreter Rückgabetyp für Kind1
};
</code></pre>
<p>Um dir genauer helfen zu können, solltest genau sagen, was du brauchst. Am besten illustrierst du es zusätzlich an einem kleinen Stück Code.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1790371</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1790371</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Fri, 09 Oct 2009 19:42:44 GMT</pubDate></item></channel></rss>