<?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[Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb?]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei normalen Klassen sollte man die Methoden-Definitionen von längeren Methoden ja in die Implementationsdatei auslagern. Das soll man bei Template-Klassen ja nicht machen.<br />
Sollte man dann die Definitionen direkt in die Klassendeklaration schreiben oder unterhalb der Klasse? Also</p>
<pre><code>#ifndef STAPEL_H
#define STAPEL_H

#include &lt;valarray&gt;
#include &lt;stdexcept&gt;

template &lt;typename T&gt;
class Stapel
	: private valarray&lt;T&gt;
{
...
	T const&amp; pop ()
	{
		if ( _hoehe == 0 )
			throw out_of_range( &quot;Stapel ist leer!&quot; ) ;

		--_hoehe ;
		return (*this)[ _hoehe ] ;
	}
...
}

#endif
</code></pre>
<p>oder</p>
<pre><code>#ifndef STAPEL_H
#define STAPEL_H

#include &lt;valarray&gt;
#include &lt;stdexcept&gt;

template &lt;typename T&gt;
class Stapel
	: private valarray&lt;T&gt;
{
...
	T const&amp; pop () ;
...
}

template&lt;typename T&gt;
T const&amp; Stapel&lt;T&gt;::pop()
{
	if ( _hoehe == 0 )
		throw out_of_range( &quot;Stapel ist leer!&quot; ) ;

	--_hoehe ;
	return (*this)[ _hoehe ] ;
}

#endif
</code></pre>
<p>?</p>
<p>Danke,<br />
Thilo</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/326832/definitionen-von-template-klassen-methoden-in-die-klassendeklaration-oder-unterhalb</link><generator>RSS for Node</generator><lastBuildDate>Sat, 30 May 2026 19:41:24 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/326832.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 09 Jul 2014 13:49:27 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 13:49:27 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>bei normalen Klassen sollte man die Methoden-Definitionen von längeren Methoden ja in die Implementationsdatei auslagern. Das soll man bei Template-Klassen ja nicht machen.<br />
Sollte man dann die Definitionen direkt in die Klassendeklaration schreiben oder unterhalb der Klasse? Also</p>
<pre><code>#ifndef STAPEL_H
#define STAPEL_H

#include &lt;valarray&gt;
#include &lt;stdexcept&gt;

template &lt;typename T&gt;
class Stapel
	: private valarray&lt;T&gt;
{
...
	T const&amp; pop ()
	{
		if ( _hoehe == 0 )
			throw out_of_range( &quot;Stapel ist leer!&quot; ) ;

		--_hoehe ;
		return (*this)[ _hoehe ] ;
	}
...
}

#endif
</code></pre>
<p>oder</p>
<pre><code>#ifndef STAPEL_H
#define STAPEL_H

#include &lt;valarray&gt;
#include &lt;stdexcept&gt;

template &lt;typename T&gt;
class Stapel
	: private valarray&lt;T&gt;
{
...
	T const&amp; pop () ;
...
}

template&lt;typename T&gt;
T const&amp; Stapel&lt;T&gt;::pop()
{
	if ( _hoehe == 0 )
		throw out_of_range( &quot;Stapel ist leer!&quot; ) ;

	--_hoehe ;
	return (*this)[ _hoehe ] ;
}

#endif
</code></pre>
<p>?</p>
<p>Danke,<br />
Thilo</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407782</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407782</guid><dc:creator><![CDATA[Thilo87]]></dc:creator><pubDate>Wed, 09 Jul 2014 13:49:27 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 13:53:47 GMT]]></title><description><![CDATA[<p>Thilo87 schrieb:</p>
<blockquote>
<p>Sollte man dann die Definitionen direkt in die Klassendeklaration schreiben oder unterhalb der Klasse? Also</p>
</blockquote>
<p>Das ist reine Geschmackssache. Ich nutze ersteres nur in einfachen Fällen, letzteres finde ich bei komplexeren Klassen oder Methoden, die mehr als Einzeiler sind, übersichtlicher.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407784</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407784</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Wed, 09 Jul 2014 13:53:47 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 13:54:25 GMT]]></title><description><![CDATA[<p>Ist denke ich dir überlassen. Je nachdem wie es übersichtlicher ist.</p>
<p>Meine Meinung: Kurze, triviale Methoden (z.B. Setter, Getter) direkt in die Klassendeklaration, längere danach (dein Pop würde ich auch eher zu den längeren zählen). Sonst wird die Klassendeklaration zu unübersichtlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407785</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407785</guid><dc:creator><![CDATA[oenone]]></dc:creator><pubDate>Wed, 09 Jul 2014 13:54:25 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 14:10:03 GMT]]></title><description><![CDATA[<blockquote>
<p>Sollte man dann die Definitionen direkt in die Klassendeklaration schreiben oder unterhalb der Klasse?</p>
</blockquote>
<p>Ich empfehle dir alles in die Klassendefinition zu packen was du kannst. Außerhalb kommt nerviger Boilerplate dazu. Wenn die Funktionen zu lang werden als dass man sie in der Klasse behalten könnte ist das sowieso ein tendenziell schlechtes Indiz!</p>
<blockquote>
<p>dein Pop würde ich auch eher zu den längeren zählen</p>
</blockquote>
<p>Vier Zeilen ist nicht lang - <code>pop</code> sollte hier IMO in die Klassendefinition.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407788</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407788</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 09 Jul 2014 14:10:03 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 14:28:07 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">if ( _hoehe == 0 )
    throw out_of_range( &quot;Stapel ist leer!&quot; ) ;
--_hoehe ;
return (*this)[ _hoehe ] ;
</code></pre>
<p>-&gt;</p>
<pre><code class="language-cpp">assert(_hoehe &gt; 0);
return (*this)[ --_hoehe ];
</code></pre>
<pre><code class="language-cpp">: private valarray&lt;T&gt;
</code></pre>
<p>Äussert kontrovers, ich hätte valarray als Member genommen, das macht den Code übersichtlicher. Aber solange die Vererbung privat bleibt, ist das ok.</p>
<pre><code class="language-cpp">T const&amp; Stapel&lt;T&gt;::pop()
</code></pre>
<p>T const&amp; zurückzugeben ist auch zweifelhaft. Bei deiner Implementierung rufst du den Destruktor nicht auf, das ist für den Anwender unerwartet. Mindestens dokumentieren, besser ändern.</p>
<p>Ich behalte Klassendefinitionen fast immer ausschliesslich im Header. Klassen machen das nötigste und stellen gekapselten Zugriff auf die Daten bereit, die komplizierten Algorithmen drauf führen freie Funktionen aus.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407791</guid><dc:creator><![CDATA[karl popper]]></dc:creator><pubDate>Wed, 09 Jul 2014 14:28:07 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 14:41:28 GMT]]></title><description><![CDATA[<p>karl popper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">T const&amp; Stapel&lt;T&gt;::pop()
</code></pre>
<p>T const&amp; zurückzugeben ist auch zweifelhaft. Bei deiner Implementierung rufst du den Destruktor nicht auf, das ist für den Anwender unerwartet. Mindestens dokumentieren, besser ändern.</p>
</blockquote>
<p>Ja, da hatte ich auch überlegt. Problem ist eben, dass mit</p>
<pre><code>T Stapel&lt;T&gt;::pop()
</code></pre>
<p>bei der Rückgabe ja kopiert wird. Je nachdem, was der Stapel enthält, kann das eben schon an die Performance gehen.</p>
<p>Und</p>
<pre><code>T&amp; Stapel&lt;T&gt;::pop()
</code></pre>
<p>wäre keine get-Methode mehr.</p>
<p>Würdet ihr trotzdem</p>
<pre><code>T Stapel&lt;T&gt;::pop()
</code></pre>
<p>verwenden?</p>
<p>Edit: Achso, sehe gerade, dass in der Aufgabe das const&amp; vorgegeben war.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407793</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407793</guid><dc:creator><![CDATA[Thilo87]]></dc:creator><pubDate>Wed, 09 Jul 2014 14:41:28 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 16:54:24 GMT]]></title><description><![CDATA[<blockquote>
<p>bei der Rückgabe ja kopiert wird.</p>
</blockquote>
<p>Soll er ja auch. Sonst ist es recht doof dass man dangling references bekommen kann.</p>
<p>(Wenn überhaupt solltest du den Rückgabewert <strong>moven</strong>, nicht kopieren!)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407807</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407807</guid><dc:creator><![CDATA[Columbo]]></dc:creator><pubDate>Wed, 09 Jul 2014 16:54:24 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 16:55:43 GMT]]></title><description><![CDATA[<p>Arcoth schrieb:</p>
<blockquote>
<p>(Wenn überhaupt solltest du den Rückgabewert <strong>moven</strong>, nicht kopieren!)</p>
</blockquote>
<p>Leider ist pop() nicht so einfach ausnahmensicher zu machen, wenn das gepoppte Element zurückgegeben wird.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407808</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407808</guid><dc:creator><![CDATA[recht doof]]></dc:creator><pubDate>Wed, 09 Jul 2014 16:55:43 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 17:06:50 GMT]]></title><description><![CDATA[<p>Was meinst du mit <strong>moven</strong>? Als dynamisches Objekt zurückgeben?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407812</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407812</guid><dc:creator><![CDATA[Thilo87]]></dc:creator><pubDate>Wed, 09 Jul 2014 17:06:50 GMT</pubDate></item><item><title><![CDATA[Reply to Definitionen von Template-Klassen-Methoden in die Klassendeklaration oder unterhalb? on Wed, 09 Jul 2014 17:08:21 GMT]]></title><description><![CDATA[<p>Habe sowieso nie verstanden, warum die Funktionalität nicht getrennt (in T&amp; top() und void pop()) wird, bei normalen Containern gibt es ja auch back() zum anschauen des letzten Elementes, und pop_back zum Entfernen desselben. Andererseits ist stack ja sowieso eine völlig überflüssiger Adapter.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2407813</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2407813</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 09 Jul 2014 17:08:21 GMT</pubDate></item></channel></rss>