<?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[Iteratoren - Stack als Klassentemplate - die zweite]]></title><description><![CDATA[<p>Hy!<br />
Und schon wieder ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ich habe hier einen Stack in Form eines Klassentemplates geschrieben.</p>
<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {			// Exceptionklasse
public:
	char *what(void);
	StackError(char *);
private:
	char *error;
};

StackError::StackError(char *error) {
	this-&gt;error = error;
}

char *StackError::what(void) {
	return error;
}

template&lt;class ANY_TYPE&gt;
class Stack {
public:
	Stack(void);
	~Stack(void);
	void push(const ANY_TYPE &amp;) throw (StackError);
	void top(ANY_TYPE &amp;) throw (StackError);
	void pop(void) throw (StackError);
	bool is_empty(void);
private:
	struct list_el {
		ANY_TYPE data;
		list_el *pnext;
	};
	list_el *stack_pointer;
};

template &lt;class ANY_TYPE&gt;
Stack&lt;ANY_TYPE&gt;::Stack(void) {
	stack_pointer = NULL;
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::push(const ANY_TYPE &amp;element) throw (StackError) {	// schiebt Element in den Stack
	list_el *temp = new list_el;	// erstellt neues Listenelement
	if(temp == NULL)					// wenn kein Speicher vorhanden ...
		throw StackError(&quot;kein Heapspeicher frei!&quot;);
	temp-&gt;data = element;			// speichert uebergebene Daten
	temp-&gt;pnext = stack_pointer;	// Verkettung
	stack_pointer = temp;			// StackPointer auf neues Element
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::top(ANY_TYPE &amp;element) throw (StackError) {	// liest erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	element = stack_pointer-&gt;data;	// gibt erstes Element zurueck
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::pop(void) throw (StackError) {				// loescht erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	list_el *temp = stack_pointer;
	stack_pointer = stack_pointer-&gt;pnext;
	delete temp;
}

template &lt;class ANY_TYPE&gt;
bool Stack&lt;ANY_TYPE&gt;::is_empty(void) {
	if(stack_pointer == NULL)	// prueft ob erstes Element vorhanden
		return true;
	else
		return false;
}

template &lt;class ANY_TYPE&gt;
Stack&lt;ANY_TYPE&gt;::~Stack(void) {
	delete stack_pointer;
}

#endif // STACK_H_
</code></pre>
<p>Habe das ganze noch mit Exceptions gemacht zur Fehlerbehandlung, dass jetzt auch funktionieren dürfte. Nun soll ich noch einen Iterator der um ein oder mehrere Elemente weiter geschaltet werden kann (++ bzw. +=) schreiben, die Iteratorfunktionen begin() und end() und dann noch insert und erase zum Einfügen von Elementen, oder eben halt wieder zum löschen.<br />
Ich bin jetzt schon die ganze zeit da am rumprobieren, aber irgendwie werd ich mit den Iteratoren einfach nicht fertig. Jeder Versuch endet in der Mülltonne, weil ich den Code anscheiend immer so verschandel, dass der Compiler nur noch Müll ausspuckt. Habe auch schon nach den FAQs hier geschaut und meinen Nachbar google. Leider liegt mein Buch zu Hause und ich bin grad unerwegs, und finde auch keine Quelle die es für mich klar ersichtlich macht. Ich glaube ich habe mich schon wieder selber verwirrt und blick jetzt mal wieder garnicht durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Achja, hier noch die main.ccp</p>
<pre><code class="language-cpp">// main.cpp //

#include &lt;iostream&gt;
#include &quot;Stack.h&quot;
using namespace std;

int main(void) {
	float zahl_float;

	Stack&lt;float&gt; *float_stack = new Stack&lt;float&gt;();
	cout &lt;&lt; &quot;float_stack erzeugt&quot; &lt;&lt; endl;

	try {
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
		float_stack-&gt;push(3.1415);
		cout &lt;&lt; &quot;&gt;&gt;3.1415&quot; &lt;&lt; endl;
		float_stack-&gt;push(2.322);
		cout &lt;&lt; &quot;&gt;&gt;2.322&quot; &lt;&lt; endl;
		float_stack-&gt;push(1.333);
		cout &lt;&lt; &quot;&gt;&gt;1.333&quot; &lt;&lt; endl;
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
	}
	catch(StackError err) {
		cout &lt;&lt; err.what() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Vielleicht könnt ihr mir ja einen Anhaltspunkt geben wo ich überhaupt Anfangen muss, weil ich seh schon wieder den Wald vor Bäumen nicht mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/topic/216249/iteratoren-stack-als-klassentemplate-die-zweite</link><generator>RSS for Node</generator><lastBuildDate>Sun, 11 Oct 2026 07:01:17 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/216249.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 21 Jun 2008 12:41:54 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sat, 21 Jun 2008 12:44:57 GMT]]></title><description><![CDATA[<p>Hy!<br />
Und schon wieder ich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f644.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_rolling_eyes"
      title=":rolling_eyes:"
      alt="🙄"
    /><br />
Ich habe hier einen Stack in Form eines Klassentemplates geschrieben.</p>
<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {			// Exceptionklasse
public:
	char *what(void);
	StackError(char *);
private:
	char *error;
};

StackError::StackError(char *error) {
	this-&gt;error = error;
}

char *StackError::what(void) {
	return error;
}

template&lt;class ANY_TYPE&gt;
class Stack {
public:
	Stack(void);
	~Stack(void);
	void push(const ANY_TYPE &amp;) throw (StackError);
	void top(ANY_TYPE &amp;) throw (StackError);
	void pop(void) throw (StackError);
	bool is_empty(void);
private:
	struct list_el {
		ANY_TYPE data;
		list_el *pnext;
	};
	list_el *stack_pointer;
};

template &lt;class ANY_TYPE&gt;
Stack&lt;ANY_TYPE&gt;::Stack(void) {
	stack_pointer = NULL;
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::push(const ANY_TYPE &amp;element) throw (StackError) {	// schiebt Element in den Stack
	list_el *temp = new list_el;	// erstellt neues Listenelement
	if(temp == NULL)					// wenn kein Speicher vorhanden ...
		throw StackError(&quot;kein Heapspeicher frei!&quot;);
	temp-&gt;data = element;			// speichert uebergebene Daten
	temp-&gt;pnext = stack_pointer;	// Verkettung
	stack_pointer = temp;			// StackPointer auf neues Element
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::top(ANY_TYPE &amp;element) throw (StackError) {	// liest erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	element = stack_pointer-&gt;data;	// gibt erstes Element zurueck
}

template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::pop(void) throw (StackError) {				// loescht erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	list_el *temp = stack_pointer;
	stack_pointer = stack_pointer-&gt;pnext;
	delete temp;
}

template &lt;class ANY_TYPE&gt;
bool Stack&lt;ANY_TYPE&gt;::is_empty(void) {
	if(stack_pointer == NULL)	// prueft ob erstes Element vorhanden
		return true;
	else
		return false;
}

template &lt;class ANY_TYPE&gt;
Stack&lt;ANY_TYPE&gt;::~Stack(void) {
	delete stack_pointer;
}

#endif // STACK_H_
</code></pre>
<p>Habe das ganze noch mit Exceptions gemacht zur Fehlerbehandlung, dass jetzt auch funktionieren dürfte. Nun soll ich noch einen Iterator der um ein oder mehrere Elemente weiter geschaltet werden kann (++ bzw. +=) schreiben, die Iteratorfunktionen begin() und end() und dann noch insert und erase zum Einfügen von Elementen, oder eben halt wieder zum löschen.<br />
Ich bin jetzt schon die ganze zeit da am rumprobieren, aber irgendwie werd ich mit den Iteratoren einfach nicht fertig. Jeder Versuch endet in der Mülltonne, weil ich den Code anscheiend immer so verschandel, dass der Compiler nur noch Müll ausspuckt. Habe auch schon nach den FAQs hier geschaut und meinen Nachbar google. Leider liegt mein Buch zu Hause und ich bin grad unerwegs, und finde auch keine Quelle die es für mich klar ersichtlich macht. Ich glaube ich habe mich schon wieder selber verwirrt und blick jetzt mal wieder garnicht durch <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f615.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--confused_face"
      title=":confused:"
      alt="😕"
    /></p>
<p>Achja, hier noch die main.ccp</p>
<pre><code class="language-cpp">// main.cpp //

#include &lt;iostream&gt;
#include &quot;Stack.h&quot;
using namespace std;

int main(void) {
	float zahl_float;

	Stack&lt;float&gt; *float_stack = new Stack&lt;float&gt;();
	cout &lt;&lt; &quot;float_stack erzeugt&quot; &lt;&lt; endl;

	try {
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
		float_stack-&gt;push(3.1415);
		cout &lt;&lt; &quot;&gt;&gt;3.1415&quot; &lt;&lt; endl;
		float_stack-&gt;push(2.322);
		cout &lt;&lt; &quot;&gt;&gt;2.322&quot; &lt;&lt; endl;
		float_stack-&gt;push(1.333);
		cout &lt;&lt; &quot;&gt;&gt;1.333&quot; &lt;&lt; endl;
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		float_stack-&gt;top(zahl_float);
		cout &lt;&lt; zahl_float &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; endl;
		float_stack-&gt;pop();
		if(float_stack-&gt;is_empty())
			cout &lt;&lt; &quot;is_empty()=true&quot; &lt;&lt; endl;
		else
			cout &lt;&lt; &quot;is empty()=false&quot; &lt;&lt; endl;
	}
	catch(StackError err) {
		cout &lt;&lt; err.what() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
<p>Vielleicht könnt ihr mir ja einen Anhaltspunkt geben wo ich überhaupt Anfangen muss, weil ich seh schon wieder den Wald vor Bäumen nicht mehr <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f62e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_open_mouth"
      title=":open_mouth:"
      alt="😮"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533233</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533233</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Sat, 21 Jun 2008 12:44:57 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sat, 21 Jun 2008 13:10:57 GMT]]></title><description><![CDATA[<p>Hallo <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
<p>also zuerst musst du eine iteratorneklasse in der stackklasse anlegen</p>
<pre><code class="language-cpp">class stack
{
    //...
    class Iterator
    {
        //...
    private:
        list_el *stack_pos;
    };
};
</code></pre>
<p>zu den funktionen des iterators:</p>
<p>der operator ++ ist ganz einfach, der zeiger wird einfach aufs nächste element gesetzt</p>
<pre><code class="language-cpp">stack_pos = stack_pos-&gt;pnext;
</code></pre>
<p>+= läuft in einer schleife einfach immer weiter. wenn zwischendurch der zeiger 0 ist, dann ist ende und das heißt fehler.</p>
<p>insert und erase machen für mich jetzt keinen sinn, da sie gegen das prinzip eines stacks verstoßen</p>
<p>mfg templater</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533246</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533246</guid><dc:creator><![CDATA[templater]]></dc:creator><pubDate>Sat, 21 Jun 2008 13:10:57 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sat, 21 Jun 2008 16:39:50 GMT]]></title><description><![CDATA[<p>Hi.<br />
Nur ein paar Hinweise...</p>
<ol>
<li></li>
</ol>
<blockquote>
<pre><code class="language-cpp">void Stack&lt;ANY_TYPE&gt;::push(const ANY_TYPE &amp;element) throw (StackError) {    // schiebt Element in den Stack
    list_el *temp = new list_el;    // erstellt neues Listenelement 
    if(temp == NULL)                    // wenn kein Speicher vorhanden ... 
        throw StackError(&quot;kein Heapspeicher frei!&quot;);
</code></pre>
</blockquote>
<p>Das ist falsch, da new nicht einfach 0 zurückliefert im Fehlerfall, sondern eine Exception vom Typ std::bad_alloc wirft.<br />
Durch die Exception-Spec &quot;throw (StackError)&quot; würde an der Stelle dann std::unexpected aufgerufen wenn ein std::bad_alloc fliegt, da std::bad_alloc nicht in der Liste der &quot;erlaubten&quot; Exceptions steht - vorausgesetzt der verwendete Compiler unterstützt Exception-Specs überhaupt ausreichend vollständig.</p>
<ol start="2">
<li>
<p>Ich würde dir raten überhaupt keine Exception-Specs zu verwenden. Einzige Ausnahme: Funktionen bei denen immer (=in jeder Implementierung) garantiert werden kann dass sie keinesfalls irgendwelche Exceptions werfen können sollten bzw. dürfen ruhig mit &quot;throw ()&quot; gekennzeichnet werden.</p>
</li>
<li>
<p>Statt &quot;ANY_TYPE&quot; schreibt man üblicherweise einfach &quot;T&quot;, genauso wie man indexvariablen in Schleifen einfach &quot;i&quot; nennt. Hat sich eingebürgert und wird weithin verstanden.</p>
</li>
</ol>
]]></description><link>https://www.c-plusplus.net/forum/post/1533326</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533326</guid><dc:creator><![CDATA[hustbaer]]></dc:creator><pubDate>Sat, 21 Jun 2008 16:39:50 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sat, 21 Jun 2008 17:29:43 GMT]]></title><description><![CDATA[<p>Das ist noch nicht alles, was zu Exceptions zu sagen ist. Nicht nur die Speicherallokation kann fehlschlagen, auch die Initialisierung des Nodeobjektes list_el kann fehlschlagen mit einer unbekannten Exception, nähmlich dann, wenn der Defaultkonstruktor von ANY_TYPE es tut. Gleiches gilt für die Zuweisung</p>
<pre><code class="language-cpp">temp-&gt;data = element;
</code></pre>
<p>In diesem Falle haben wir es nicht nur mit einer Verletzung der Exceptionspezifikation zu tun, es kommt noch ein Speicherleck (temp) hinzu. Die Exceptionspezifikation ist folglich falsch und kann gar nicht richtig erfolgen, wenn ANY_TYPE nicht irgendwie eingeschränkt ist. Zudem ist die Zuweisung ineffizient, da das list_el::data ggf. erst einmal defaultinitialisert werden muss - zudem schränkt es die möglichen ANY_TYPEs unnötig ein, indem eben nur defaultkonstruierbare Typen möglich sind. Das führt uns dazu, dass auch list_el nicht einfach eine einfache (POD-)Datenstruktur sein sollte. Zudem ist der Inhalt von list_el ein Implementationsartefakt, das nicht unbedingt im Template Stack definiert werden muss.</p>
<pre><code class="language-cpp">template&lt;class ANY_TYPE&gt;
class Stack {
public:
    Stack();  // throw(), lass das void weg, das erzeugt nur Augenkrebs (hat zwar Bjarne erfunden aber C ist schuld)
    ~Stack(); // throw()
    void push(const ANY_TYPE &amp;);
    void top(ANY_TYPE &amp;) const; // StackError ist möglich, aber auch eine (nicht näher spezifizierbare) Exception wegen Zuweisungsfehler
    void pop(); // hier könnte ggf. throw() hin, wenn man verlangt, dass der dtor von ANY_TYPE keine Exception wirft (im Dtor sollte man nie werfen)
    bool is_empty() const; // throw()
private:
    struct list_el;
    list_el *stack_pointer;
};
</code></pre>
<p>damit die Zuweisung verschwindet und wir unser Leckproblem umgehen, kriegt list_el einen Konstruktor</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
struct Stack&lt;T&gt;::list_el
{
    list_el(list_el* next, const T&amp; data) : next(next), data(data) {}
    list_el* next;
    T data;
};
</code></pre>
<p>push wird damit trivial</p>
<pre><code class="language-cpp">template &lt;typename T&gt;
void Stack&lt;T&gt;::push(const T&amp; element) {
    stack_pointer = new list_el( stack_pointer, element );
}
</code></pre>
<p>Der Rest ergibt sich analog.</p>
<p>Edit: du solltest dir den Destruktor von Stack noch einmal genau anschauen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533341</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533341</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 21 Jun 2008 17:29:43 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sun, 22 Jun 2008 10:58:37 GMT]]></title><description><![CDATA[<p>bei den destruktoren hab ich noch nich so ganz durchgeschnallt.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
Stack&lt;T&gt;::~Stack(void) {
	if(stack_pointer-&gt;pnext != NULL) {
		delete stack_pointer;
		stack_pointer = NULL;
	}
}
</code></pre>
<p>besser?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533587</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533587</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Sun, 22 Jun 2008 10:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sun, 22 Jun 2008 13:31:28 GMT]]></title><description><![CDATA[<p>Vermeide Wiederholungen. pop weiß bereits, wie man richtig Elemente entfernt. Kein Grund, warum der Destruktor das auch noch wissen muss.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
Stack&lt;T&gt;::~Stack() {
    while ( !is_empty() )
        pop();
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1533650</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533650</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 22 Jun 2008 13:31:28 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sun, 22 Jun 2008 14:51:26 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>Vermeide Wiederholungen. pop weiß bereits, wie man richtig Elemente entfernt. Kein Grund, warum der Destruktor das auch noch wissen muss.</p>
<pre><code class="language-cpp">template &lt;class T&gt;
Stack&lt;T&gt;::~Stack() {
    while ( !is_empty() )
        pop();
}
</code></pre>
</blockquote>
<p>ah okay, alles klar.</p>
<p>wenn ich jetzt in der pop-Funtion den list_el *temp weglassen würde, würden die datensätze dann nicht mehr richtig gelöscht werden, oder?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533702</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533702</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Sun, 22 Jun 2008 14:51:26 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Sun, 22 Jun 2008 15:21:55 GMT]]></title><description><![CDATA[<p>ex.aveal schrieb:</p>
<blockquote>
<p>wenn ich jetzt in der pop-Funtion den list_el *temp weglassen würde, würden die datensätze dann nicht mehr richtig gelöscht werden, oder?</p>
</blockquote>
<p>wie weglassen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1533726</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1533726</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sun, 22 Jun 2008 15:21:55 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 09:34:19 GMT]]></title><description><![CDATA[<p>camper schrieb:</p>
<blockquote>
<p>ex.aveal schrieb:</p>
<blockquote>
<p>wenn ich jetzt in der pop-Funtion den list_el *temp weglassen würde, würden die datensätze dann nicht mehr richtig gelöscht werden, oder?</p>
</blockquote>
<p>wie weglassen?</p>
</blockquote>
<p>folgendes:</p>
<p>wenn ich anstatt ...</p>
<pre><code class="language-cpp">template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::pop(void) throw (StackError) {                // loescht erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    list_el *temp = stack_pointer;
    stack_pointer = stack_pointer-&gt;pnext;
    delete temp;
}
</code></pre>
<p>... nur ...</p>
<pre><code class="language-cpp">template &lt;class ANY_TYPE&gt;
void Stack&lt;ANY_TYPE&gt;::pop(void) throw (StackError) {                // loescht erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    stack_pointer = stack_pointer-&gt;pnext;
}
</code></pre>
<p>schreibe. hoffe ihr checkt was ich mein <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/1534626</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534626</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Tue, 24 Jun 2008 09:34:19 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 10:03:41 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>da es (auch) kein <em>delete</em> mehr geben würde, wird auch nichts gelöscht. Der <em>stack_pointer</em> zeigt zwar auf das &quot;richtige&quot; Element, aber das nicht mehr benötigte Element &quot;hängt&quot; nutzlos im Speicher (&quot;memory leak&quot;).</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534641</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534641</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Tue, 24 Jun 2008 10:03:41 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 13:33:05 GMT]]></title><description><![CDATA[<p>okay alles klar und danke schonmal!</p>
<p>habe jetzt folgenden code, schmeißt aber noch etliche errors und warnings raus. versuche gerade zu debuggen, aber find noch nicht wirklich die fehler. Der Compiler meldet zB eine Neudefinition von iterator bei den Funktionen begin() und end(). also ich versteh ganichts mehr.</p>
<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {			// Exceptionklasse
public:
	char *what(void);
	StackError(char *);
private:
	char *error;
};

StackError::StackError(char *error) {
	this-&gt;error = error;
}

char *StackError::what(void) {		// Abfrage um welche Exception es sich handelt
	return error;
}

template &lt;class T&gt;
class Stack {
private:
	struct list_el;
	list_el *stack_pointer;
public:
	Stack();
	~Stack();
	void push(const T &amp;) throw (StackError);
	void top(T &amp;) throw (StackError);
	void pop() throw (StackError);
	bool is_empty();
	class iterator {			// iterator-Klasse
	public:
		iterator(list_el *pos = NULL);
		void operator++() throw (StackError);
		void operator+=(const int) throw (StackError);
		void insert() throw (StackError);
		void erase() throw (StackError);
	private:
		list_el *pElement;				// Zeiger auf Element
	};
	iterator begin();
	iterator end();
};

////////////// LISTENELEMENTE //////////////

template &lt;typename T&gt;			// Template fuer Listenelement
struct Stack&lt;T&gt;::list_el {
	list_el(list_el *pnext, const T &amp;data) : pnext(pnext), data(data) {}	// Konstruktur
	list_el *pnext;				// Verkettung
	T data;						// Daten des Listenelements
};

////////////// STACK //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::Stack(void) {
	stack_pointer = NULL;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::push(const T &amp;element) throw (StackError) {	// schiebt Element in den Stack
	stack_pointer = new list_el(stack_pointer, element);	// erstellt neues Listenelement
	if(stack_pointer == NULL)								// wenn kein Speicher vorhanden ...
		throw StackError(&quot;kein Heapspeicher frei!&quot;);		// Exception
}

template &lt;class T&gt;
void Stack&lt;T&gt;::top(T &amp;element) throw (StackError) {	// liest erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	element = stack_pointer-&gt;data;	// gibt erstes Element zurueck
}

template &lt;class T&gt;
void Stack&lt;T&gt;::pop(void) throw (StackError) {				// loescht erstes Element
	if(is_empty())
		throw StackError(&quot;Stack ist leer!&quot;);
	list_el *temp = stack_pointer;					// temp zum loeschen des Elements
	stack_pointer = stack_pointer-&gt;pnext;
	delete temp;
	temp = NULL;
}

template &lt;class T&gt;
bool Stack&lt;T&gt;::is_empty(void) {
	if(stack_pointer == NULL)	// prueft ob erstes Element vorhanden
		return true;
	else
		return false;
}

template &lt;class T&gt;
Stack&lt;T&gt;::~Stack(void) {
	while(!is_empty())
		pop(); 
}

////////////// ITERATOR //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::iterator::iterator(list_el *pos) {
	pElement = pos;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator++(void) {
	pElement = pElement-&gt;pnext;
	if(pElement == NULL)
		throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator+=(const int n) {
	int i;
	for(i = 0; i &gt;= n; i++) {
		pElement = pElement-&gt;pnext;
		if(pElement == NULL)
			throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
	}
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::erase(void) {
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::insert(void) {
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::begin(void) {
	Stack&lt;T&gt;::iterator it(stack_pointer);		// stack_pointer zeigt immer auf erstes Element
	return it;
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::end(void) {
	for(;;) {
		if(pElement-&gt;pnext == NULL)				// hangelt sich bis zum letzten element durch
			Stack&lt;T&gt;::iterator it(pElement);
		pElement = pElement-&gt;pnext;
		return it;
	}
}

#endif // STACK_H_
</code></pre>
<p>und hier ist die build dazu, heftig <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>
<blockquote>
<p>------ Erstellen gestartet: Projekt: uebung_09_iteratoren, Konfiguration: Debug Win32 ------<br />
Kompilieren...<br />
main.cpp<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(30) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(46): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;&quot;.<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(31) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(32) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(37) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(34): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;::iterator&quot;.<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(38) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(39) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(40) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(65) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(72) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(79) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(135) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Stack&lt;T&gt;::begin'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(135) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(141) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Stack&lt;T&gt;::end'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(141) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(141) : error C2086: 'int iterator': Neudefinition<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(135): Siehe Deklaration von 'iterator'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(30) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(10): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;&quot;.<br />
with<br />
[<br />
T=float<br />
]<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(31) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(32) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(18) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(20) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(22) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'<br />
c:\eigene dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(24) : error C2065: 'zahl_float': nichtdeklarierter Bezeichner<br />
Das Buildprotokoll wurde unter &quot;file://c:\Eigene Dateien\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\Debug\BuildLog.htm&quot; gespeichert.<br />
uebung_09_iteratoren - 6 Fehler, 16 Warnung(en)<br />
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========</p>
</blockquote>
]]></description><link>https://www.c-plusplus.net/forum/post/1534695</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534695</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Tue, 24 Jun 2008 13:33:05 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 16:26:24 GMT]]></title><description><![CDATA[<blockquote>
<pre><code class="language-cpp">template &lt;class T&gt;
Stack::iterator Stack&lt;T&gt;::begin(void)...
</code></pre>
</blockquote>
<p>So sollte das gehen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1534929</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534929</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Tue, 24 Jun 2008 16:26:24 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 17:13:16 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {            // Exceptionklasse
public:
    char *what(void);                                                                                   // dies sollte alles mit const char*
    StackError(char *);                                                                                 // arbeiten, da du hier vorhast, Literale
private:                                                                                                // zu übergeben, zudem ist kein sinnvoller Grund erkennbar
    char *error;                                                                                        // weshalb ein Handler den String verändern wollte
};

StackError::StackError(char *error) {                                                                   // bevorzuge die Initialisierungsliste
    this-&gt;error = error;                                                                                // ist hier zwar egal, kann aber sonst schnell unübersichtlich werden
}

char *StackError::what(void) {        // Abfrage um welche Exception es sich handelt                    // Funktion verändert das Exception-Objekt nicht -&gt; const
    return error;
}

// StackError ist simpel genug, dass es kürzer und verständlicher wird, wenn du die Funktionenn inline in der Klassendefinition definierst

template &lt;class T&gt;
class Stack {
private:
    struct list_el;
    list_el *stack_pointer;
public:
    Stack();
    ~Stack();
    void push(const T &amp;) throw (StackError);                                                            // die Exceptionspezifikation ist zweifelhaft (hängt tatsächlich von T ab)
    void top(T &amp;) throw (StackError);                                                                   // dito, gibt logisch einen Wert zurück, für Spielereien mit Referenzen gibt es keinen Grund
                                                                                                        // --&gt; const T&amp; top() const   oder  T top() const
                                                                                                        // in ersterem Falle müsste man spezifizieren, ob und wann die Referenz ungültig wird
                                                                                                        // Funktion verändert den Stack nicht -&gt; const
    void pop() throw (StackError);
    bool is_empty();                                                                                    // -&gt; const
    class iterator {            // iterator-Klasse
    public:
        iterator(list_el *pos = NULL);
        void operator++() throw (StackError);                                                           // postfix ++ fehlt
        void operator+=(const int) throw (StackError);                                                  // operator + fehlt (sollte aber freie Funktion bleiben -&gt; ggf. friend oder Bezug auf +=)
        void insert() throw (StackError);                                                               // was macht diese Funktion ?
        void erase() throw (StackError);                                                                // dito
    private:
        list_el *pElement;                // Zeiger auf Element
    };
    iterator begin();                                                                                   // -&gt; const
    iterator end();                                                                                     // -&gt; const
};

////////////// LISTENELEMENTE //////////////

template &lt;typename T&gt;            // Template fuer Listenelement
struct Stack&lt;T&gt;::list_el {
    list_el(list_el *pnext, const T &amp;data) : pnext(pnext), data(data) {}    // Konstruktor
    list_el *pnext;                // Verkettung
    T data;                        // Daten des Listenelements
};

////////////// STACK //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::Stack(void) {                                                                                 // Initialsierungsliste ?
    stack_pointer = NULL;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::push(const T &amp;element) throw (StackError) {    // schiebt Element in den Stack
    stack_pointer = new list_el(stack_pointer, element);    // erstellt neues Listenelement
    if(stack_pointer == NULL)                                // wenn kein Speicher vorhanden ...        // das kann niemals passieren
        throw StackError(&quot;kein Heapspeicher frei!&quot;);        // Exception                                // ^
}

template &lt;class T&gt;
void Stack&lt;T&gt;::top(T &amp;element) throw (StackError) {    // liest erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    element = stack_pointer-&gt;data;    // gibt erstes Element zurueck
}

template &lt;class T&gt;
void Stack&lt;T&gt;::pop(void) throw (StackError) {                // loescht erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    list_el *temp = stack_pointer;                    // temp zum loeschen des Elements
    stack_pointer = stack_pointer-&gt;pnext;
    delete temp;
    temp = NULL;                                                                                        // überflüssig
}

template &lt;class T&gt;
bool Stack&lt;T&gt;::is_empty(void) {
    if(stack_pointer == NULL)    // prueft ob erstes Element vorhanden                                  // bitte
        return true;                                                                                    // nicht
    else                                                                                                // so
        return false;                                                                                   // umständlich
}

template &lt;class T&gt;
Stack&lt;T&gt;::~Stack(void) {
    while(!is_empty())
        pop();
}

////////////// ITERATOR //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::iterator::iterator(list_el *pos) {                                                            // Initialisierungsliste ?
    pElement = pos;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator++(void) {
    pElement = pElement-&gt;pnext;
    if(pElement == NULL)
        throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator+=(const int n) {
    int i;
    for(i = 0; i &gt;= n; i++) {                                                                           // du hast bereits op++ geschrieben
        pElement = pElement-&gt;pnext;                                                                     // warum alles doppelt ?
        if(pElement == NULL)                                                                            // ruf doch einfach den anderen operator auf
            throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);                                  //
    }
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::erase(void) {                                                                  // Funktion ?
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::insert(void) {                                                                 // Funktion ?
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::begin(void) {                                                                        // iterator ist in Stack&lt;T&gt; verschachtelter Bezeichner -&gt; Stack&lt;T&gt;::iterator
    Stack&lt;T&gt;::iterator it(stack_pointer);        // stack_pointer zeigt immer auf erstes Element        // außerdem ist es ein Typ, der von T abhängt
    return it;                                                                                          // -&gt; typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::begin() { ...
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::end(void) {                                                                          // dito:  typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::end() { ...
    for(;;) {
        if(pElement-&gt;pnext == NULL)                // hangelt sich bis zum letzten element durch        // etwas stimmt hier nicht...
            Stack&lt;T&gt;::iterator it(pElement);                                                            // Stack&lt;T&gt;:: ist hier nicht notwendig, da wir uns ohnehin im Scope der Klasse befinden
        pElement = pElement-&gt;pnext;                                                                     // zudem musst du keine benannte Variable verwenden
        return it;                                                                                      // gib den Wert doch direkt zurück:  return iterator(pElement)
    }
}

#endif // STACK_H_
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1534957</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1534957</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Jun 2008 17:13:16 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 20:33:51 GMT]]></title><description><![CDATA[<p>bekomme mit dem überarbeiteten code von dir genau die gleichen fehlermeldungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
<pre><code>------ Erstellen gestartet: Projekt: uebung_09_iteratoren, Konfiguration: Debug Win32 ------
Kompilieren...
main.cpp
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(32) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
        d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(51): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;&quot;.
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(33) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(37) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(42) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
        d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(39): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;::iterator&quot;.
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(43) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(44) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(45) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(70) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(77) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(84) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(140) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Stack&lt;T&gt;::begin'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(140) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(146) : error C2143: Syntaxfehler: Es fehlt ';' vor 'Stack&lt;T&gt;::end'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(146) : error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: &quot;default-int&quot; wird von C++ nicht unterstützt.
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(146) : error C2086: 'int iterator': Neudefinition
        d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(140): Siehe Deklaration von 'iterator'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(32) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
        d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(10): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template &quot;Stack&lt;T&gt;&quot;.
        with
        [
            T=float
        ]
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(33) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\stack.h(37) : warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(18) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(20) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(22) : warning C4305: 'Argument': Verkürzung von 'double' in 'const float'
d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\main.cpp(24) : error C2065: 'zahl_float': nichtdeklarierter Bezeichner
Das Buildprotokoll wurde unter &quot;file://d:\docs\fh\it4\informatik 3\uebungen\uebung_09_iteratoren\uebung_09_iteratoren\Debug\BuildLog.htm&quot; gespeichert.
uebung_09_iteratoren - 6 Fehler, 16 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1535118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535118</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Tue, 24 Jun 2008 20:33:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Tue, 24 Jun 2008 22:23:53 GMT]]></title><description><![CDATA[<p>ex.aveal schrieb:</p>
<blockquote>
<p>bekomme mit dem überarbeiteten code von dir genau die gleichen fehlermeldungen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61e.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--disappointed_face"
      title=":("
      alt="😞"
    /></p>
</blockquote>
<p>Ich habe nichts überarbeitet, nur kommentiert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1535201</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535201</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 24 Jun 2008 22:23:53 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Wed, 25 Jun 2008 09:40:58 GMT]]></title><description><![CDATA[<p>ich hab den fehler gefunden!</p>
<pre><code>template &lt;class T&gt;
typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::begin(void) {
    ...
}
</code></pre>
<p>^^ so funktioniert es jetzt auch. die erase funktion hab ich jetzt auch so ungefähr hinbekommen, allerdings funktioiniert sie glaub nicht, wenn nur noch ein einziges element im stack ist. die insert funktion weiß ich einfach nicht wie mein prof haben will, keinen plan.</p>
<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {            // Exceptionklasse
public:
    char *what(void);
    StackError(char *);
private:
    char *error;
};

StackError::StackError(char *error) {
    this-&gt;error = error;
}

char *StackError::what(void) {        // Abfrage um welche Exception es sich handelt
    return error;
}

template &lt;class T&gt;
class Stack {
private:
    struct list_el;
    list_el *stack_pointer;
public:
    Stack();
    ~Stack();
    void push(const T &amp;) throw (StackError);
    void top(T &amp;) throw (StackError);
    void pop() throw (StackError);
    bool is_empty();
    class iterator {            // iterator-Klasse
    public:
        iterator(list_el *pos);
		iterator();
        void operator++() throw (StackError);
        void operator+=(const int) throw (StackError);
        void insert(const T &amp;) throw (StackError);
        void erase() throw (StackError);
		void getit(T &amp;);
    private:
        list_el *pElement;                // Zeiger auf Element
    };
    iterator begin();
    iterator end();
};

////////////// LISTENELEMENTE //////////////

template &lt;typename T&gt;            // Template fuer Listenelement
struct Stack&lt;T&gt;::list_el {
    list_el(list_el *pnext, const T &amp;data) : pnext(pnext), data(data) {}    // Konstruktur
    list_el *pnext;                // Verkettung
    T data;                        // Daten des Listenelements
};

////////////// STACK //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::Stack(void) {
    stack_pointer = NULL;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::push(const T &amp;element) throw (StackError) {    // schiebt Element in den Stack
    stack_pointer = new list_el(stack_pointer, element);    // erstellt neues Listenelement
    if(stack_pointer == NULL)                                // wenn kein Speicher vorhanden ...
        throw StackError(&quot;kein Heapspeicher frei!&quot;);        // Exception
}

template &lt;class T&gt;
void Stack&lt;T&gt;::top(T &amp;element) throw (StackError) {    // liest erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    element = stack_pointer-&gt;data;    // gibt erstes Element zurueck
}

template &lt;class T&gt;
void Stack&lt;T&gt;::pop(void) throw (StackError) {                // loescht erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    list_el *temp = stack_pointer;                    // temp zum loeschen des Elements
    stack_pointer = stack_pointer-&gt;pnext;
    delete temp;
    temp = NULL;
}

template &lt;class T&gt;
bool Stack&lt;T&gt;::is_empty(void) {
    if(stack_pointer == NULL)    // prueft ob erstes Element vorhanden
        return true;
    else
        return false;
}

template &lt;class T&gt;
Stack&lt;T&gt;::~Stack(void) {
    while(!is_empty())
        pop();
}

////////////// ITERATOR //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::iterator::iterator(list_el *pos) {
    pElement = pos;
}

template &lt;class T&gt;
Stack&lt;T&gt;::iterator::iterator(void) {
    pElement = NULL;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator++(void) {
    pElement = pElement-&gt;pnext;
	if(pElement == NULL)
        throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator+=(const int n) {
    int i;
    for(i = 0; i &lt; n; i++) {
        pElement = pElement-&gt;pnext;
		if(pElement == NULL) {
            throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
		}
    }
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::getit(T &amp;element) {
	element = pElement-&gt;data;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::erase(void) {
	if(pElement == NULL)
		throw (&quot;Element nicht vorhanden!&quot;);
	list_el *temp1 = pElement;
	list_el *temp2;
	for(;;) {
		temp2 = temp1-&gt;pnext;			// verschiebt die Daten der Elemente ab Iterator ein Element nach vorne
		temp1-&gt;data = temp2-&gt;data;
		if(temp2-&gt;pnext == NULL)		// hoere auf, wenn kein weiteres Element mehr exestiert
			break;
		temp1 = temp1-&gt;pnext;
	}
	temp1-&gt;pnext = NULL;		// neues Ende makieren
	delete temp2;				// letztes Element loeschen
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::insert(const T &amp;element) {
	list_el *temp = new list_el(pElement-&gt;pnext, element);	// Zeiger auf Neues Element mit pnext auf naechstes Element
	pElement-&gt;pnext = temp;
}

template &lt;class T&gt;
typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::begin(void) {
    Stack&lt;T&gt;::iterator it(stack_pointer);        // stack_pointer zeigt immer auf erstes Element
    return it;
}

template &lt;class T&gt;
typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::end(void) {
	list_el *temp = stack_pointer;
    for(;;) {												
		if(temp-&gt;pnext == NULL)
			break;
		temp = temp-&gt;pnext;				// hangelt sich bis zum letzten Element durch
    }
	Stack&lt;T&gt;::iterator it(++temp);		// ++ -&gt; &quot;HINTER&quot; das letzte Element
	return it;
}

#endif // STACK_H_
</code></pre>
<p>die main:</p>
<pre><code class="language-cpp">// main.cpp //

#include &lt;iostream&gt;
#include &quot;Stack.h&quot;
using namespace std;

int main(void) {
	float zahl_float;
	float zahl_float_it;

	int i;

	Stack&lt;float&gt; float_stack;
	Stack&lt;float&gt;::iterator it;
	cout &lt;&lt; &quot;float_stack erzeugt&quot; &lt;&lt; endl;

	try {
		cout &lt;&lt; &quot;is_empty()=&quot; &lt;&lt; float_stack.is_empty() &lt;&lt; endl;
		float_stack.push(6.3278);
		float_stack.push(5.322); 
		float_stack.push(4.984);
		float_stack.push(3.1415);
		float_stack.push(2.563);
		float_stack.push(1.434);
		cout &lt;&lt; &quot;&gt;&gt;6.3278 &gt;&gt;5.322 &gt;&gt;4.984 &gt;&gt;3.1415 &gt;&gt;2.563 &gt;&gt;1.434&quot; &lt;&lt; endl;

		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		++it;
		cout &lt;&lt; &quot;++it;&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		it += 2;
		cout &lt;&lt; &quot;it += 2;&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		it.erase();
		cout &lt;&lt; &quot;erase();&quot; &lt;&lt; endl;
		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;

		for(i = 0; i &lt; 5; ++i) {
			it.getit(zahl_float_it);
			cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;
			if(i &lt; 4)
				++it;
		}

		it = float_stack.end();
		cout &lt;&lt; &quot;end();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		++it;
		cout &lt;&lt; &quot;++it;&quot; &lt;&lt; endl;
		it.insert(3.3333);
		cout &lt;&lt; &quot;insert(3.3333);&quot; &lt;&lt; endl;
		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;

		for(i = 0; i &lt; 6; ++i) {
			it.getit(zahl_float_it);
			cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;
			if(i &lt; 5)
				++it;
		}

		it = float_stack.begin();
		cout &lt;&lt; &quot;begin();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;
		it = float_stack.end();
		cout &lt;&lt; &quot;end();&quot; &lt;&lt; endl;
		it.getit(zahl_float_it);
		cout &lt;&lt; &quot;zahl_float_it=&quot; &lt;&lt; zahl_float_it &lt;&lt; endl;

		float_stack.top(zahl_float);
		cout &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; zahl_float;
		float_stack.pop();
		float_stack.top(zahl_float);
		cout &lt;&lt; &quot; &lt;&lt;&quot; &lt;&lt; zahl_float;
		float_stack.pop();
		float_stack.top(zahl_float);
		cout &lt;&lt; &quot; &lt;&lt;&quot; &lt;&lt; zahl_float &lt;&lt; endl;

		cout &lt;&lt; &quot;is_empty()=&quot; &lt;&lt; float_stack.is_empty() &lt;&lt; endl;

		float_stack.pop();
		float_stack.top(zahl_float);
		cout &lt;&lt; &quot;&lt;&lt;&quot; &lt;&lt; zahl_float;
		float_stack.pop();
		float_stack.top(zahl_float);
		cout &lt;&lt; &quot; &lt;&lt;&quot; &lt;&lt; zahl_float;
		float_stack.pop();
		float_stack.top(zahl_float);
		cout &lt;&lt; &quot; &lt;&lt;&quot; &lt;&lt; zahl_float &lt;&lt; endl;
		float_stack.pop();

		cout &lt;&lt; &quot;is_empty()=&quot; &lt;&lt; float_stack.is_empty() &lt;&lt; endl;
	}
	catch(StackError err) {
		cout &lt;&lt; err.what() &lt;&lt; endl;
	}
	return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1535217</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535217</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Wed, 25 Jun 2008 09:40:58 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Wed, 25 Jun 2008 11:38:48 GMT]]></title><description><![CDATA[<p>Auf den Fehler habe ich und camper dich bereits hingewiesen. (Auch wenn ich bei mir das Template Argument vergessen habe).</p>
<p>Im übrigen solltest du die Kommentare, die camper dir gegeben hat dennoch mal anschauen, wenn er sich schon die Mühe macht alles so schön zu kommentieren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1535488</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535488</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 25 Jun 2008 11:38:48 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Wed, 25 Jun 2008 11:58:37 GMT]]></title><description><![CDATA[<p>drakon schrieb:</p>
<blockquote>
<p>Auf den Fehler habe ich und camper dich bereits hingewiesen. (Auch wenn ich bei mir das Template Argument vergessen habe).</p>
<p>Im übrigen solltest du die Kommentare, die camper dir gegeben hat dennoch mal anschauen, wenn er sich schon die Mühe macht alles so schön zu kommentieren.</p>
</blockquote>
<p>ich habe die Kommentare von camper sehr wohl durchgelesen, ...</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">// Stack.h //

#ifndef STACK_H_
#define STACK_H_

class StackError {            // Exceptionklasse
public:
    char *what(void);                                                                                   // dies sollte alles mit const char*
    StackError(char *);                                                                                 // arbeiten, da du hier vorhast, Literale
private:                                                                                                // zu übergeben, zudem ist kein sinnvoller Grund erkennbar
    char *error;                                                                                        // weshalb ein Handler den String verändern wollte
};

StackError::StackError(char *error) {                                                                   // bevorzuge die Initialisierungsliste
    this-&gt;error = error;                                                                                // ist hier zwar egal, kann aber sonst schnell unübersichtlich werden
}

char *StackError::what(void) {        // Abfrage um welche Exception es sich handelt                    // Funktion verändert das Exception-Objekt nicht -&gt; const
    return error;
}

// StackError ist simpel genug, dass es kürzer und verständlicher wird, wenn du die Funktionenn inline in der Klassendefinition definierst
</code></pre>
</blockquote>
<p>leider alles vorgaben meines profs.</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">template &lt;class T&gt;
class Stack {
private:
    struct list_el;
    list_el *stack_pointer;
public:
    Stack();
    ~Stack();
    void push(const T &amp;) throw (StackError);                                                            // die Exceptionspezifikation ist zweifelhaft (hängt tatsächlich von T ab)
    void top(T &amp;) throw (StackError);                                                                   // dito, gibt logisch einen Wert zurück, für Spielereien mit Referenzen gibt es keinen Grund
                                                                                                        // --&gt; const T&amp; top() const   oder  T top() const
                                                                                                        // in ersterem Falle müsste man spezifizieren, ob und wann die Referenz ungültig wird
                                                                                                        // Funktion verändert den Stack nicht -&gt; const
    void pop() throw (StackError);
    bool is_empty();                                                                                    // -&gt; const
    class iterator {            // iterator-Klasse
</code></pre>
</blockquote>
<p>ebenfalls alle funktionsrümpfe vorgaben meines profs.</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">public:
        iterator(list_el *pos = NULL);
        void operator++() throw (StackError);                                                           // postfix ++ fehlt
        void operator+=(const int) throw (StackError);                                                  // operator + fehlt (sollte aber freie Funktion bleiben -&gt; ggf. friend oder Bezug auf +=)
        void insert() throw (StackError);                                                               // was macht diese Funktion ?
        void erase() throw (StackError);                                                                // dito
    private:
        list_el *pElement;                // Zeiger auf Element
    };
    iterator begin();                                                                                   // -&gt; const
    iterator end();                                                                                     // -&gt; const
};
</code></pre>
</blockquote>
<p>sollten nur den präfix ++-operator machen sowie den +=, ebenfalls vorgaben des profs. die funktion erase loescht ein element vom stack, auf das der iterator zeigt, insert fügt eins ein. vorgabe vom prof, und ja ich weiß, dass das den sinn und zweck eines lifo widerspricht.</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">////////////// LISTENELEMENTE //////////////

template &lt;typename T&gt;            // Template fuer Listenelement
struct Stack&lt;T&gt;::list_el {
    list_el(list_el *pnext, const T &amp;data) : pnext(pnext), data(data) {}    // Konstruktor
    list_el *pnext;                // Verkettung
    T data;                        // Daten des Listenelements
};

////////////// STACK //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::Stack(void) {                                                                                 // Initialsierungsliste ?
    stack_pointer = NULL;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::push(const T &amp;element) throw (StackError) {    // schiebt Element in den Stack
    stack_pointer = new list_el(stack_pointer, element);    // erstellt neues Listenelement
    if(stack_pointer == NULL)                                // wenn kein Speicher vorhanden ...        // das kann niemals passieren
        throw StackError(&quot;kein Heapspeicher frei!&quot;);        // Exception                                // ^
}

template &lt;class T&gt;
void Stack&lt;T&gt;::top(T &amp;element) throw (StackError) {    // liest erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    element = stack_pointer-&gt;data;    // gibt erstes Element zurueck
}

template &lt;class T&gt;
void Stack&lt;T&gt;::pop(void) throw (StackError) {                // loescht erstes Element
    if(is_empty())
        throw StackError(&quot;Stack ist leer!&quot;);
    list_el *temp = stack_pointer;                    // temp zum loeschen des Elements
    stack_pointer = stack_pointer-&gt;pnext;
    delete temp;
    temp = NULL;                                                                                        // überflüssig
</code></pre>
</blockquote>
<p>nicht überflüssig, sonst wird das element auf den der stack_pointer gezeigt hat nicht entfernt</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">}

template &lt;class T&gt;
bool Stack&lt;T&gt;::is_empty(void) {
    if(stack_pointer == NULL)    // prueft ob erstes Element vorhanden                                  // bitte
        return true;                                                                                    // nicht
    else                                                                                                // so
        return false;                                                                                   // umständlich
</code></pre>
</blockquote>
<p>wie weniger umständlich? bool funktion muss es bleiben, da vorgabe des profs</p>
<p>camper schrieb:</p>
<blockquote>
<pre><code class="language-cpp">}

template &lt;class T&gt;
Stack&lt;T&gt;::~Stack(void) {
    while(!is_empty())
        pop();
}

////////////// ITERATOR //////////////

template &lt;class T&gt;
Stack&lt;T&gt;::iterator::iterator(list_el *pos) {                                                            // Initialisierungsliste ?
    pElement = pos;
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator++(void) {
    pElement = pElement-&gt;pnext;
    if(pElement == NULL)
        throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::operator+=(const int n) {
    int i;
    for(i = 0; i &gt;= n; i++) {                                                                           // du hast bereits op++ geschrieben
        pElement = pElement-&gt;pnext;                                                                     // warum alles doppelt ?
        if(pElement == NULL)                                                                            // ruf doch einfach den anderen operator auf
            throw StackError(&quot;iterator hinter Stackende geschaltet!&quot;);                                  //
    }
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::erase(void) {                                                                  // Funktion ?
}

template &lt;class T&gt;
void Stack&lt;T&gt;::iterator::insert(void) {                                                                 // Funktion ?
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::begin(void) {                                                                        // iterator ist in Stack&lt;T&gt; verschachtelter Bezeichner -&gt; Stack&lt;T&gt;::iterator
    Stack&lt;T&gt;::iterator it(stack_pointer);        // stack_pointer zeigt immer auf erstes Element        // außerdem ist es ein Typ, der von T abhängt
    return it;                                                                                          // -&gt; typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::begin() { ...
}

template &lt;class T&gt;
iterator Stack&lt;T&gt;::end(void) {                                                                          // dito:  typename Stack&lt;T&gt;::iterator Stack&lt;T&gt;::end() { ...
    for(;;) {
        if(pElement-&gt;pnext == NULL)                // hangelt sich bis zum letzten element durch        // etwas stimmt hier nicht...
            Stack&lt;T&gt;::iterator it(pElement);                                                            // Stack&lt;T&gt;:: ist hier nicht notwendig, da wir uns ohnehin im Scope der Klasse befinden
        pElement = pElement-&gt;pnext;                                                                     // zudem musst du keine benannte Variable verwenden
        return it;                                                                                      // gib den Wert doch direkt zurück:  return iterator(pElement)
    }
}

#endif // STACK_H_
</code></pre>
</blockquote>
<p>usw den rest...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1535504</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1535504</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Wed, 25 Jun 2008 11:58:37 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 07:40:59 GMT]]></title><description><![CDATA[<p>ex.aveal schrieb:</p>
<blockquote>
<p>nicht überflüssig, sonst wird das element auf den der stack_pointer gezeigt hat nicht entfernt</p>
</blockquote>
<p>Doch, ist wirklich unnötig hier auf <em>NULL</em> zu setzen, noch hinzu kommt, dass <em>temp</em> als lokale Variable sowieso nach dem Ende des Gültigkeitsbereichs nicht mehr zur Verfügung steht.</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536051</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536051</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Thu, 26 Jun 2008 07:40:59 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 10:03:10 GMT]]></title><description><![CDATA[<blockquote>
<p>wie weniger umständlich? bool funktion muss es bleiben, da vorgabe des profs</p>
</blockquote>
<p>Was hältst du von</p>
<pre><code class="language-cpp">template &lt;class T&gt;
bool Stack&lt;T&gt;::is_empty(void) {
    return stack_pointer == NULL;
}
</code></pre>
<p>Außerdem ist dein Stack&lt;T&gt;::push falsch. <em>new</em> gibt nicht NULL zurück, sondern wirft eine Exception, wenn kein Speicher mehr verfügbar ist.<br />
Dadurch dass du die nicht fängst ist schonmal das <em>throw (StackError)</em> falsch und dein Programm beendet sich einfach.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536173</guid><dc:creator><![CDATA[DerKuchen]]></dc:creator><pubDate>Thu, 26 Jun 2008 10:03:10 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 12:16:13 GMT]]></title><description><![CDATA[<p>ja okay, is wohl kürzer, werds mal noch ändern.</p>
<p>aber die push funktion funktioniert zumindestens und das programm beendet sich nicht selbst. leider habe ich exceptions noch nicht wirklich behandelt, daher kann ich nicht nachvollziehen was da jetzt falsch sein sollte etc. muss mich da selber erst einarbeiten</p>
<p>Probe-Nutzer schrieb:</p>
<blockquote>
<p>ex.aveal schrieb:</p>
<blockquote>
<p>nicht überflüssig, sonst wird das element auf den der stack_pointer gezeigt hat nicht entfernt</p>
</blockquote>
<p>Doch, ist wirklich unnötig hier auf <em>NULL</em> zu setzen, noch hinzu kommt, dass <em>temp</em> als lokale Variable sowieso nach dem Ende des Gültigkeitsbereichs nicht mehr zur Verfügung steht.</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
</blockquote>
<p>der erste datensatz bleibt laut meinem prof sonst im speicher und wird erst bei programmende wieder freigegeben. aufdauer würde es sonst eben zum absturz kommen. temp == NULL zu setzen ist nicht zwingend nötig, aber &quot;guter programmier stil&quot; ... wieder laut prof.</p>
<p>aber trotzdem danke nochmal an alle für die hilfe</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536303</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536303</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Thu, 26 Jun 2008 12:16:13 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 12:22:09 GMT]]></title><description><![CDATA[<p>ex.aveal schrieb:</p>
<blockquote>
<p>temp == NULL zu setzen ist nicht zwingend nötig, aber &quot;guter programmier stil&quot; ... wieder laut prof.</p>
</blockquote>
<p>Dein Prof ist vielleicht ein guter Theoretiker, aber danach hört es auf. Lokale Variablen die nicht mehr verwendet werden (oder auch Membervariablen die nicht mehr verwendet werden) brauchen nicht extra eine Sonderbehandlung.</p>
<p>Besonders schön sind solche unnötigen Codekonstrukte (wo ein &quot;delete zeiger&quot; ausgereicht hätte):</p>
<pre><code class="language-cpp">Klassenname::~Klassenname()
{
  if(!zeiger)
  {
    delete zeiger;
    zeiger = 0;
  }
}
</code></pre>
<p>So im realen Projekt vorhanden. Und was Programmierstil angeht: Code soll übersichtlich sein, wenn unnötige Zeilen den Code verlängern reduziert dies ebenso die Lesbarkeit wie schlechtes Einrücken.</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536309</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536309</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Jun 2008 12:22:09 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 13:16:09 GMT]]></title><description><![CDATA[<p>ex.aveal schrieb:</p>
<blockquote>
<p>aber die push funktion funktioniert zumindestens und das programm beendet sich nicht selbst.</p>
</blockquote>
<p>Ja, damit sich das Programm beendet, muss auch das allokieren des Speichers fehlschlagen. Vermutlich hast Du diese Situation einfach noch nicht erreicht.</p>
<p>Der Punkt ist aber, dass Dein Programm <strong>niemals</strong>, also auch nicht <strong>wenn</strong> die Allokation schiefgeht, einen StackError auslösen kann. Denn diese Form von new liefert <strong>niemals</strong> NULL als Ergebnis.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536358</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536358</guid><dc:creator><![CDATA[LordJaxom]]></dc:creator><pubDate>Thu, 26 Jun 2008 13:16:09 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 13:26:10 GMT]]></title><description><![CDATA[<p>LordJaxom schrieb:</p>
<blockquote>
<p>Denn diese Form von new liefert <strong>niemals</strong> NULL als Ergebnis.</p>
</blockquote>
<p>Doch auf SEHHHR alten Compilern <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="😉"
    /> (VC6 und Co.)</p>
<p>Vielleicht sollte sich der Dozent vom OP mal mit den C++ Standard auseinander setzen (Nachdem er nun 10 Jahre draußen ist, und der nächste vor der Tür steht).</p>
<p>cu André</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536363</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536363</guid><dc:creator><![CDATA[asc]]></dc:creator><pubDate>Thu, 26 Jun 2008 13:26:10 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 14:14:51 GMT]]></title><description><![CDATA[<p>und wie würde dann eine lösung des problems aussehen?<br />
wie und was müßte ich denn dann aufrufen?!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1536410</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536410</guid><dc:creator><![CDATA[ex.aveal]]></dc:creator><pubDate>Thu, 26 Jun 2008 14:14:51 GMT</pubDate></item><item><title><![CDATA[Reply to Iteratoren - Stack als Klassentemplate - die zweite on Thu, 26 Jun 2008 14:38:52 GMT]]></title><description><![CDATA[<p>Das hier sollte so funktionieren, wie du es dir vorgestellt hast:</p>
<pre><code class="language-cpp">template &lt;class T&gt;
void Stack&lt;T&gt;::push(const T &amp;element) throw (StackError) {
    try { 
        stack_pointer = new list_el(stack_pointer, element);
    }
    catch (std::bad_alloc) {
        throw StackError(&quot;kein Heapspeicher frei!&quot;);
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1536436</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1536436</guid><dc:creator><![CDATA[DerKuchen]]></dc:creator><pubDate>Thu, 26 Jun 2008 14:38:52 GMT</pubDate></item></channel></rss>