<?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[Frage zu einem Klassen-Template]]></title><description><![CDATA[<p>Hallo zusammen nochmals eine Frage zu Template Klassen.</p>
<p>Ich habe zwei Klassen, einmal Complex und einmal CMatrix. Diese waren vorher ohne Templates realisiert, ich möchte nun aber gerne für die Klasse Complex eine Template-Klasse anlegen.</p>
<p>Das ist im Grunde ja nicht schwer, nur bekomme ich nun einen Error. Der Zeiger **dat vom Typ Complex fehlt nun die Argumentliste für &quot;Klassenvorlage &quot;Complex&quot;&quot;. Auch bei der Speicherzuweisung das gleiche Problem.</p>
<p>Welche Argumente müssen dem Zeiger denn übergeben werden und warum? In meinen Unterlagen wird auf so ein Problem nicht eingegangen <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>
<pre><code>// Template Klasse Complex //
template&lt;typename T&gt; class Complex
{
private:
	T re;
	T im;
public:
	Complex(T r=0, T i=0) : re(r), im(i) {}
};

// Alte Klasse Complex ohne Template //
//class Complex
//{
//private:
//	double re;
//	double im;
//
//public:
//	Complex(double r=0, double i=0) : re(r), im(i) {}
//};

class CMatrix
{
private:
	Complex** dat; // Zeiger auf Zeiger auf Typ Complex mit Namen dat
	int m; // Zeilen
	int n; // Spalten

public:
	CMatrix (int n, int m);
	~CMatrix();

	int getM() const;
	int getN() const;

};

CMatrix::CMatrix (int n, int m)
	: m(m), n(n)
{

	dat = new Complex*[m]; // Speicher für Zeilen alokieren
	for (int i=0; i&lt;m; i++) // Speicher für Spalten alokieren
		dat[i] = new Complex[n];

}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/318541/frage-zu-einem-klassen-template</link><generator>RSS for Node</generator><lastBuildDate>Mon, 27 Jul 2026 06:48:42 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/318541.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 16 Jul 2013 19:34:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 19:34:02 GMT]]></title><description><![CDATA[<p>Hallo zusammen nochmals eine Frage zu Template Klassen.</p>
<p>Ich habe zwei Klassen, einmal Complex und einmal CMatrix. Diese waren vorher ohne Templates realisiert, ich möchte nun aber gerne für die Klasse Complex eine Template-Klasse anlegen.</p>
<p>Das ist im Grunde ja nicht schwer, nur bekomme ich nun einen Error. Der Zeiger **dat vom Typ Complex fehlt nun die Argumentliste für &quot;Klassenvorlage &quot;Complex&quot;&quot;. Auch bei der Speicherzuweisung das gleiche Problem.</p>
<p>Welche Argumente müssen dem Zeiger denn übergeben werden und warum? In meinen Unterlagen wird auf so ein Problem nicht eingegangen <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>
<pre><code>// Template Klasse Complex //
template&lt;typename T&gt; class Complex
{
private:
	T re;
	T im;
public:
	Complex(T r=0, T i=0) : re(r), im(i) {}
};

// Alte Klasse Complex ohne Template //
//class Complex
//{
//private:
//	double re;
//	double im;
//
//public:
//	Complex(double r=0, double i=0) : re(r), im(i) {}
//};

class CMatrix
{
private:
	Complex** dat; // Zeiger auf Zeiger auf Typ Complex mit Namen dat
	int m; // Zeilen
	int n; // Spalten

public:
	CMatrix (int n, int m);
	~CMatrix();

	int getM() const;
	int getN() const;

};

CMatrix::CMatrix (int n, int m)
	: m(m), n(n)
{

	dat = new Complex*[m]; // Speicher für Zeilen alokieren
	for (int i=0; i&lt;m; i++) // Speicher für Spalten alokieren
		dat[i] = new Complex[n];

}
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2339342</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339342</guid><dc:creator><![CDATA[Tyle]]></dc:creator><pubDate>Tue, 16 Jul 2013 19:34:02 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 19:46:05 GMT]]></title><description><![CDATA[<p>Welche Art von Complex soll denn in der Matrix stehen? Complex&lt;double&gt;? Complex&lt;int&gt;? Complex&lt;T&gt;?</p>
<p>Diese Information fehlt, die musst du angeben.</p>
<p>In deinen Klassen sind mehrere dicke Designfehler:<br />
- Es gibt std::complex<br />
- Die Matrixklasse verwaltet ihren Speicher manuell, anstatt std::vector zu nutzen<br />
- Sieht tut dies auch noch falsch. Eben darum benutzt man std::vector.<br />
- Die Matrixklasse legt Listen von Listen an, was viel allgemeiner ist, als hier gewünscht. Die Matrix hat doch immer gleich lange Zeilen, also legt man alles in einem einzigen Block an und rechnet dann die Indizes passend. Das bringt einen wahnsinnigen Performancegewinn.</p>
<p>edit: Tyle, du schon wieder? Wieso muss man dir in praktisch jedem Thread neu erklären, dass du std::vector nutzen sollst? Du machst immer wieder die gleichen Fehler!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339343</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339343</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 16 Jul 2013 19:46:05 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 19:59:43 GMT]]></title><description><![CDATA[<p>Ok wenn ich caste (heisst das hier dann auch so) geht es, allerdings ist &quot;T&quot; ja nicht in der CMatrix bekannt. Gibt es da die Möglichkeit auch dort den allgemeinen Typ T zu nutzen, das die Class auch mit verschiedenen Datentypen ausgeprägt werden kann?<br />
Edit: Dort dann auch einfach ein Template definieren? Würde ich spontan so machen. Was aber vermutlich zu Fehlern führen würde...</p>
<p>Ja den Namen habe ich mir nicht ausgedacht, rate mal... genau war ne Vorgabe <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="🙄"
    /></p>
<p>Auch das selbe wieder mit Vektor, ist als Vorgabe nicht eingebunden... wie immer, geht wohl wieder darum den Speicher von Hand zu zu weisen. Ansonsten wäre Vektor hier natürlich wesentlich effektiver, muss man sich nicht drum kümmern... darum auch immer wieder die Erklärung zum Vektor <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="😞"
    /> sag das lieber meinem Prof...</p>
<p>Für die Speicherzuweisung habe ich mich an die hier im Forum beschriebene Methode orrientiert: <a href="http://www.c-plusplus.net/forum/39489-full" rel="nofollow">http://www.c-plusplus.net/forum/39489-full</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339344</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339344</guid><dc:creator><![CDATA[Tyle]]></dc:creator><pubDate>Tue, 16 Jul 2013 19:59:43 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 20:04:57 GMT]]></title><description><![CDATA[<p>Du kannst aus der Matrix auch ein template machen:</p>
<pre><code>template&lt;class T&gt;
class Complex
{
// ...
};

template&lt;class T&gt;
class CMatrix
{
// ...
    typename Complex&lt;T&gt;** dat;
// ...
};
</code></pre>
<p>(Bin mir mit dem typename nicht sicher, müsste aber dahin, weil der Typ von einem template Parameter indirekt abhängt, oder?!)</p>
<p>Aber Tyle, du willst trotzdem verschachtelte Arrays machen, auf eigene Faust. Beherzige SeppJ's Tipp und nimm nur ein Array und rechne dir die Indizes passend. (Hör ruhig auf den, der hat schon fast ~19000 Posts ;))</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339349</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339349</guid><dc:creator><![CDATA[Skym0sh0]]></dc:creator><pubDate>Tue, 16 Jul 2013 20:04:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 20:10:19 GMT]]></title><description><![CDATA[<p>SeppJ hat schon gehörig Ahnung und auch fast immer recht mit dem was er sagt. Das Problem ist nur das ich meist gewisse Vorgaben bekomme, die man normalerweise in der Realität nicht benutzen würde, weil es viel zu umständlich wäre und nicht performant genug.</p>
<p>In meinem Beispiel wurde in der CMatrix</p>
<pre><code>Complex **dat
</code></pre>
<p>vorgegeben. Das entspricht halt gut der erklärent Methode hier: <a href="http://www.c-plusplus.net/forum/39489-full" rel="nofollow">http://www.c-plusplus.net/forum/39489-full</a> (Fall 1).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339350</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339350</guid><dc:creator><![CDATA[Tyle]]></dc:creator><pubDate>Tue, 16 Jul 2013 20:10:19 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Tue, 16 Jul 2013 22:25:57 GMT]]></title><description><![CDATA[<p>Dann aber bitte wenigstens unter Beachtung der großen Drei, sonst geht das bei der ersten Kopie einer Matrix schief:<br />
<a href="http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29" rel="nofollow">http://en.wikipedia.org/wiki/Rule_of_three_(C%2B%2B_programming)</a></p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339366</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339366</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 16 Jul 2013 22:25:57 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Wed, 17 Jul 2013 06:08:44 GMT]]></title><description><![CDATA[<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>(Bin mir mit dem typename nicht sicher, müsste aber dahin, weil der Typ von einem template Parameter indirekt abhängt, oder?!)</p>
</blockquote>
<p>Nee, typename muss nicht.<br />
typename nur, wenn du auf ein typedef von etwas zugreifen willst, was von einem Template abhängig ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339376</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339376</guid><dc:creator><![CDATA[Nathan]]></dc:creator><pubDate>Wed, 17 Jul 2013 06:08:44 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Wed, 17 Jul 2013 10:56:32 GMT]]></title><description><![CDATA[<p>Tyle schrieb:</p>
<blockquote>
<pre><code>CMatrix::CMatrix (int n, int m)
	: m(m), n(n)
{

	dat = new Complex*[m]; // Speicher für Zeilen alokieren
</code></pre>
</blockquote>
<p>Mir ist kein Fall bekannt, wo eine Matrix als Matrix(Spalten,Zeilen) deklariert ist. Üblich wäre Matrix(Zeilen,Spalten).</p>
<p>Skym0sh0 schrieb:</p>
<blockquote>
<p>Du kannst aus der Matrix auch ein template machen:</p>
<pre><code>template&lt;class T&gt;
class Complex
{
// ...
};

template&lt;class T&gt;
class CMatrix
{
// ...
    typename Complex&lt;T&gt;** dat;
// ...
};
</code></pre>
</blockquote>
<p>flexibler wäre:</p>
<pre><code>template&lt;class T&gt;
class Complex
{
// ...
};

template&lt;class T&gt;
class CMatrix
{
// ...
    T** dat; // besser T* dat und nur einen Datenbereich (hör' auf SeppJ)
      // und noch besser wäre eine eigene Buffer-Klasse, wenn Du std::vector&lt;&gt; nicht benutzen sollst
// ...
};

typedef CMatrix&lt;Complex&lt;double&gt; &gt; CMatrixComplexDouble;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2339411</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339411</guid><dc:creator><![CDATA[Kenner der Matrix]]></dc:creator><pubDate>Wed, 17 Jul 2013 10:56:32 GMT</pubDate></item><item><title><![CDATA[Reply to Frage zu einem Klassen-Template on Wed, 17 Jul 2013 11:17:35 GMT]]></title><description><![CDATA[<p>Kenner der Matrix schrieb:</p>
<blockquote>
<pre><code>// und noch besser wäre eine eigene Buffer-Klasse, wenn Du std::vector&lt;&gt; nicht benutzen sollst
</code></pre>
</blockquote>
<p>Da der Lehrer das anscheinend öfters macht, wäre das eigentlich mal eine sehr lohnende Investition. In 20-30 Minuten könnte man einen einfachen vector mit minimalem Interface (operator[]) programmieren. In 2-3 Stunden auch mit Iteratoren und den meistgenutzten Teilen der STL-Schnittstelle. Dadurch gewinnt man bei jeder weiteren Hausaufgabe extrem Komfort und Fehlerfreiheit, damit auch automatisch viel Zeit. Das Wiederbenutzen von oft benutztem Code ist gerade eines der Ziele einer Hochsprache und hier bietet sich das ganz besonders gut an.</p>
<p>Für den unerfahrenen Threadersteller werden es wohl eher 2-3 Tage Programmierarbeit, aber dafür wird er ordentlich was dabei lernen. Wohl mehr als bei den hier gezeigten Übungsaufgaben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2339417</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2339417</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Wed, 17 Jul 2013 11:17:35 GMT</pubDate></item></channel></rss>