<?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[Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen?]]></title><description><![CDATA[<p>Ich versuche gerade eine Klasse &quot;Queue&quot; zu schreiben.<br />
Nun ist es aber so das diese als Membervariable ein Array enthält und dieses Array jeden Datentyp aufnehmen soll.<br />
Das nächste kleinere Problem wäre das wenn die Membervariable queue (ein Array) leer ist und ich die Funktionen remove oder peek aufrufe soll eine Art null-Zeiger zurück gegeben werden.</p>
<p>Zuerst hatte ich gedacht das ich das Array vom Datentyp Object erstelle, aber dies ist in C++ nicht möglich (?).</p>
<p>Dann hatte ich gelesen das man in einem solchem Fall ein Template benutzt, um diese Problem zu umgehen.</p>
<p>Oder gebe es da noch eine andere alternative...?</p>
<p>Hier mal meine Klasse vor dem Versuch mit dem Template ( ausser einer Menge von Fehlern ist da nix bei raus gekommen ):</p>
<p>Header Datei:</p>
<pre><code class="language-cpp">#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

class Queue
{

	public:
		Queue( unsigned int );
		~Queue();
		int length();
		int size();
		double add( double );
		double* remove();
		double peek();

	private:
		double* m_queue;
		unsigned int m_cnt;
		unsigned int m_size;

};
#endif	//  QUEUE_H_INCLUDED
</code></pre>
<p>Die cpp Datei:</p>
<pre><code class="language-cpp">#include &quot;Queue.h&quot;

Queue::Queue( unsigned int size = 0 )
{
	m_cnt = 0;
	m_size = size;
	m_queue = new double[ size ];
}

Queue::~Queue()
{
	delete[] m_queue;
}

double Queue::add( double o )
{
	if ( m_cnt + 1 &gt; m_size ) return NULL;

	m_queue[ m_cnt++ ] = o;	

	return o;
}

double Queue::remove()
{
	if ( m_cnt ) 
	{
		double o = new double( m_queue[0] );
		unsigned int i = 0;

		while( i++ &lt; m_cnt )
		{
			m_queue[i-1] = m_queue[i];
		}

		m_queue[ --m_cnt ] = NULL;

		return o;
	}
         else return NULL;

}

double Queue::peek()
{
	return m_cnt ? m_queue[0] : NULL;
}

int Queue::size()
{
	return m_size;	
}

int Queue::length()
{
	return m_cnt;	
}
</code></pre>
<p>Ich hoffe ihr könnt mir bei diesem Problem helfen...</p>
<p>mfg rendner</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/132518/klasse-quot-queue-quot-mit-teplate-funktionen</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 12:17:28 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/132518.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jan 2006 14:05:38 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:07:05 GMT]]></title><description><![CDATA[<p>Ich versuche gerade eine Klasse &quot;Queue&quot; zu schreiben.<br />
Nun ist es aber so das diese als Membervariable ein Array enthält und dieses Array jeden Datentyp aufnehmen soll.<br />
Das nächste kleinere Problem wäre das wenn die Membervariable queue (ein Array) leer ist und ich die Funktionen remove oder peek aufrufe soll eine Art null-Zeiger zurück gegeben werden.</p>
<p>Zuerst hatte ich gedacht das ich das Array vom Datentyp Object erstelle, aber dies ist in C++ nicht möglich (?).</p>
<p>Dann hatte ich gelesen das man in einem solchem Fall ein Template benutzt, um diese Problem zu umgehen.</p>
<p>Oder gebe es da noch eine andere alternative...?</p>
<p>Hier mal meine Klasse vor dem Versuch mit dem Template ( ausser einer Menge von Fehlern ist da nix bei raus gekommen ):</p>
<p>Header Datei:</p>
<pre><code class="language-cpp">#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED

class Queue
{

	public:
		Queue( unsigned int );
		~Queue();
		int length();
		int size();
		double add( double );
		double* remove();
		double peek();

	private:
		double* m_queue;
		unsigned int m_cnt;
		unsigned int m_size;

};
#endif	//  QUEUE_H_INCLUDED
</code></pre>
<p>Die cpp Datei:</p>
<pre><code class="language-cpp">#include &quot;Queue.h&quot;

Queue::Queue( unsigned int size = 0 )
{
	m_cnt = 0;
	m_size = size;
	m_queue = new double[ size ];
}

Queue::~Queue()
{
	delete[] m_queue;
}

double Queue::add( double o )
{
	if ( m_cnt + 1 &gt; m_size ) return NULL;

	m_queue[ m_cnt++ ] = o;	

	return o;
}

double Queue::remove()
{
	if ( m_cnt ) 
	{
		double o = new double( m_queue[0] );
		unsigned int i = 0;

		while( i++ &lt; m_cnt )
		{
			m_queue[i-1] = m_queue[i];
		}

		m_queue[ --m_cnt ] = NULL;

		return o;
	}
         else return NULL;

}

double Queue::peek()
{
	return m_cnt ? m_queue[0] : NULL;
}

int Queue::size()
{
	return m_size;	
}

int Queue::length()
{
	return m_cnt;	
}
</code></pre>
<p>Ich hoffe ihr könnt mir bei diesem Problem helfen...</p>
<p>mfg rendner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963611</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963611</guid><dc:creator><![CDATA[rendner]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:07:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:17:12 GMT]]></title><description><![CDATA[<p>Templates definierst du, indem du das Schlüsselwort &quot;template&quot; verwendest:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Queue
//Queue für Typ T - kann beliebig verwendet werden
{
public:
  Queue(unsigned int);
  //const-Referenzen sind vorteilhafter als Kopien, gerade bei eigenen Klassen
  const T&amp; add(const T&amp;);
  //...

private:
  T* m_data;
  unsigned int m_cnt;
  unsigned int m_size;
}

template&lt;typename T&gt;
Queue&lt;T&gt;::Queue(unsigned int size)
{
  ...
}
</code></pre>
<blockquote>
<p>Das nächste kleinere Problem wäre das wenn die Membervariable queue (ein Array) leer ist und ich die Funktionen remove oder peek aufrufe soll eine Art null-Zeiger zurück gegeben werden.</p>
</blockquote>
<p>remove() kann notfalls einen Null-Zeiger zurückgeben, bei peek() wäre das etwas schwieriger, dort könntest du höchstens eine Exception werfen oder einen Default-Wert zurückgeben.</p>
<p>PS: Über das Design der Klasse rede ich lieber nicht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963631</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963631</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:17:12 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:25:57 GMT]]></title><description><![CDATA[<p>Danke erstmal...werd das gleich mal umsetzen.</p>
<blockquote>
<p>PS: Über das Design der Klasse rede ich lieber nicht</p>
</blockquote>
<p>Schade, wäre trotzdem toll wenn du mal die groben Fehler sagen könntest (oder zumindest ein paar Vorschläge zur Verbesserung), da ich dies ja lernen will und da nicht so den Durchblick habe.</p>
<p>Ach ja, gibts einen Unterschied zwischen</p>
<pre><code class="language-cpp">template &lt;class T&gt;
// und
template &lt;typename T&gt;      // ?
</code></pre>
<p>mfg rendner</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963638</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963638</guid><dc:creator><![CDATA[rendner]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 17:40:13 GMT]]></title><description><![CDATA[<p>Beispielsweise benutzt man bei Queues entweder zyklisches Array (wenn man am Ende ankommt, geht man wieder nach vorne) oder eine Liste, der lineare Aufwand in remove ist nicht sinnvoll (du hast im Prinzip einen Stack programmiert). Außerdem haben sich die Namen push und pop für add und remove eingebürgert.</p>
<p>Diese Zeile</p>
<pre><code class="language-cpp">double o = new double( m_queue[0] );
</code></pre>
<p>ist schlichtweg falsch. Das sollte dir auch dein Compiler ankreiden. Was du meinst ist eine einfache Zuweisung (p[i] entspricht *(p + i)).</p>
<p>Zu deiner Frage: Es gibt keinen. Manche Leute benutzen typename wenn auch POD-Typen erlaubt sind, den Compiler scherts nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963648</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963648</guid><dc:creator><![CDATA[.filmor]]></dc:creator><pubDate>Wed, 11 Jan 2006 17:40:13 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:31:05 GMT]]></title><description><![CDATA[<p>Ein grober Fehler ist schonmal, daß sich der Rückgabetyp der remove() zwischen Deklaration und Definition geändert hat.</p>
<p>Als nächstes ist es ein ziemlicher Aufwand, bei jedem remove() die Liste umzuräumen. Und drittens ist es immer problematisch, wenn du Fehlerwerte und echte Daten durcheinander ausgibst (das aufrufende Programm kann nicht unterscheiden, ob dort gerade eine 0 im Queue stand oder ob es remove() auf einen leeren Queue anwenden wollte).</p>
<p>PS: Wenn es dir nicht um die Programmier-Übung geht, verwende lieber std::queue <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/963652</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963652</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:31:05 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:42:37 GMT]]></title><description><![CDATA[<p>@ .filmor<br />
Ein Stack ist aber doch ein bischen was anderes, ich hatte immer gedacht wenn eine queue voll ist, ist die voll und nimmt nicht irgendwelche Elemente auf und überschreibt somit andere.</p>
<blockquote>
<p>Als nächstes ist es ein ziemlicher Aufwand, bei jedem remove() die Liste umzuräumen.</p>
</blockquote>
<p>Wie könnte man dann die Methode remove( shift, da pop ja eigentlich das hinterste Element entfernt ) implementieren ohne andauernd das Array aufzuräumen?</p>
<blockquote>
<p>Und drittens ist es immer problematisch, wenn du Fehlerwerte und echte Daten durcheinander ausgibst (das aufrufende Programm kann nicht unterscheiden, ob dort gerade eine 0 im Queue stand oder ob es remove() auf einen leeren Queue anwenden wollte).</p>
</blockquote>
<p>Was könnte man im diesem Fall machen?</p>
<p>mfg rendner</p>
<p>Danke für den Tipp mit der std::queue werd ich mir mal angucken.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963668</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963668</guid><dc:creator><![CDATA[rendner]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:42:37 GMT</pubDate></item><item><title><![CDATA[Reply to Klasse &amp;quot;Queue&amp;quot; mit Teplate-Funktionen? on Wed, 11 Jan 2006 14:46:45 GMT]]></title><description><![CDATA[<p>rendner schrieb:</p>
<blockquote>
<p>Wie könnte man dann die Methode remove( shift, da pop ja eigentlich das hinterste Element entfernt ) implementieren ohne andauernd das Array aufzuräumen?</p>
</blockquote>
<p>Wie filmor schon sagte, entweder per Ringliste (du hast zwei Pointer in dein Daten-Array, die beim Lesen und Schreiben jeweils weiterrücken - wenn der Schreibzeiger den Lesezeiger &quot;überrundet&quot;, ist das Feld voll und du mußt entweder Platz schaffen oder einen Fehler zurückgeben.</p>
<blockquote>
<p>Was könnte man im diesem Fall machen?</p>
</blockquote>
<p>Entweder eine Exception zurückwerfen oder &quot;undefined behavior&quot; (der Aufrufer muß selber sicherstellen, daß er remove() nicht auf eine leere Warteschlange anwendet).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963670</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963670</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:46:45 GMT</pubDate></item></channel></rss>