<?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[Pointer auf Klasse aus Template]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Ich habe eine Frage im Bezug auf Klassentemplates. Ich habe mir eine einfache Klassentemplate &quot;DBResArray&quot; geschrieben,als Container, die andere Klassen beinhalten kann. Die DBResArray sieht so aus:</p>
<pre><code class="language-cpp">template&lt;class T, int size&gt; 
class DBResArray {
	T array[size];
public:
	T&amp; operator[](int index){
		return array[index];
	}
	int length() const {return size; }
};
</code></pre>
<p>In einer anderen Klasse habe ich versucht, dazu passende &quot;createArray&quot; Funktion<br />
zu schreiben was einen Pointer auf die DBResArray zurueckgeben soll.</p>
<pre><code class="language-cpp">//..vom outdlg.h
DBResArray&lt;DBResElement,int&gt;* createTestArray(int size);
//..vom outdlg.cpp
DBResArray&lt;DBResElement, int&gt;* OutDlg::createTestArray(int num){
	DBResArray&lt;DBResElement, num&gt; test;
return &amp;test ;
}
</code></pre>
<p>Nun wenn ich es compiliere, der Compiler von vstudio05 spuckt ein Duzend Fehlern mit:</p>
<p>error C2975: 'DBResArray' : invalid template argument for 'size', expected compile-time constant expression..</p>
<p>Deswegen die Frage, woran scheitert der Compiler? Ich vermute dass ich mit der<br />
Rueckgabedefinition 'DBResArray&lt;DBResElement, int&gt;*' etwas falsches mache..<br />
ich bin mir allerdings nicht sicher.</p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/209383/pointer-auf-klasse-aus-template</link><generator>RSS for Node</generator><lastBuildDate>Mon, 12 Oct 2026 14:42:08 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/209383.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 30 Mar 2008 03:29:53 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 03:57:07 GMT]]></title><description><![CDATA[<p>Hallo Zusammen,</p>
<p>Ich habe eine Frage im Bezug auf Klassentemplates. Ich habe mir eine einfache Klassentemplate &quot;DBResArray&quot; geschrieben,als Container, die andere Klassen beinhalten kann. Die DBResArray sieht so aus:</p>
<pre><code class="language-cpp">template&lt;class T, int size&gt; 
class DBResArray {
	T array[size];
public:
	T&amp; operator[](int index){
		return array[index];
	}
	int length() const {return size; }
};
</code></pre>
<p>In einer anderen Klasse habe ich versucht, dazu passende &quot;createArray&quot; Funktion<br />
zu schreiben was einen Pointer auf die DBResArray zurueckgeben soll.</p>
<pre><code class="language-cpp">//..vom outdlg.h
DBResArray&lt;DBResElement,int&gt;* createTestArray(int size);
//..vom outdlg.cpp
DBResArray&lt;DBResElement, int&gt;* OutDlg::createTestArray(int num){
	DBResArray&lt;DBResElement, num&gt; test;
return &amp;test ;
}
</code></pre>
<p>Nun wenn ich es compiliere, der Compiler von vstudio05 spuckt ein Duzend Fehlern mit:</p>
<p>error C2975: 'DBResArray' : invalid template argument for 'size', expected compile-time constant expression..</p>
<p>Deswegen die Frage, woran scheitert der Compiler? Ich vermute dass ich mit der<br />
Rueckgabedefinition 'DBResArray&lt;DBResElement, int&gt;*' etwas falsches mache..<br />
ich bin mir allerdings nicht sicher.</p>
<p>Danke im voraus,</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482984</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482984</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Mar 2008 03:57:07 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 05:26:42 GMT]]></title><description><![CDATA[<p>Das compiliert nicht, weil ein Integer - wie Dir dein Compiler schon sagt - keine Konstante ist (weder compiletime noch runtime) und damit als bound einer Arraydeklaration nicht zulässig. Wie man aber einen konstanten Ausdruck übergibt: gute Frage - wahrscheinlich garnicht.</p>
<p>Desweiteren gibt deine <code>OutDlg::createTestArray( )</code> die Adresse einer lokalen Variable zurück, die nach der Rückkehr aus der Funktion Asche ist.</p>
<p>Mir erschließt sich irgendwie der Sinn nicht. Du Kapselst ein simples Array brichst dir Kapselung durch die Rückgabe einer non-const reference deines <code>operator[ ]</code> ?</p>
<p>Welches Problem versuchst Du mit diesem Konstrukt zu lösen?</p>
<p>cheers, Swordfish</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1482986</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1482986</guid><dc:creator><![CDATA[Swordfish]]></dc:creator><pubDate>Sun, 30 Mar 2008 05:26:42 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 12:23:44 GMT]]></title><description><![CDATA[<p>Hallo Swordfish,</p>
<p>Swordfish schrieb:</p>
<blockquote>
<p>Welches Problem versuchst Du mit diesem Konstrukt zu lösen?</p>
</blockquote>
<p>Ich moechte einen Array von DBResElement Instanzen erstellen, dessen Laenge<br />
dynamisch bestimmt werden soll. Deswegen brauche ich fuer meinen Container<br />
DBResArray den <code>operator[]</code> . Sowie ich verstanden habe, ist Erstellung<br />
einer Klassentemplate der einfachste Weg.. Oder gibt's eine Alternative?</p>
<p>Die Verkapselung sieht natuerlich beim ersten Blick unnoetig aus. Nun, die<br />
Initizializierung der Elemente(DBResElement) des Arrays(DBResArray) wird auch<br />
in <code>OutDlg::createTestArray( )</code> ausgefuehrt. Zum anderen wird die Code<br />
dadurch lesbarer.</p>
<p>Gruss,<br />
jsbach</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483104</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483104</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Mar 2008 12:23:44 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 12:34:00 GMT]]></title><description><![CDATA[<p>jsbach schrieb:</p>
<blockquote>
<p>Hallo Swordfish,</p>
<p>Swordfish schrieb:</p>
<blockquote>
<p>Welches Problem versuchst Du mit diesem Konstrukt zu lösen?</p>
</blockquote>
<p>Ich moechte einen Array von DBResElement Instanzen erstellen, dessen Laenge<br />
dynamisch bestimmt werden soll. Deswegen brauche ich fuer meinen Container<br />
DBResArray den <code>operator[]</code> . Sowie ich verstanden habe, ist Erstellung<br />
einer Klassentemplate der einfachste Weg.. Oder gibt's eine Alternative?</p>
</blockquote>
<p>Den <em>new</em> Operator? Mit Templates wird das nicht vernünftig funktionieren, da du schon beim Compilieren festlegen musst, wie groß das Array sein soll.</p>
<p>Nimm am besten std::vector als Container. Dann hast du das Problem nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483108</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483108</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 30 Mar 2008 12:34:00 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 12:53:41 GMT]]></title><description><![CDATA[<p>Hallo ProgChild,</p>
<p>ProgChild schrieb:</p>
<blockquote>
<p>Den <em>new</em> Operator? Nimm am besten std::vector als Container. Dann hast<br />
du das Problem nicht.</p>
</blockquote>
<p>Danke, habe ich gemacht &amp; funktioniert.</p>
<p>ProgChild schrieb:</p>
<blockquote>
<p>Mit Templates wird das nicht vernünftig funktionieren, da du schon beim Compilieren festlegen musst, wie groß das Array sein soll.</p>
</blockquote>
<p>In der Tat.. Denn wenn ich <code>DBResArray&lt;DBResElement, 10&gt;*</code> in der<br />
Funktionssignatur angebe, dann klappt es auch. Dabei ist mir von Nachteil, dass<br />
ich ploetzlich einen Array zur Compilierzeit definieren muss.</p>
<p>Wozu ist Klassenemplate gut, wenn es keine dynamische Parametrisierung<br />
unterstuetzt?</p>
<p>Gruss,<br />
jsbach</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483116</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483116</guid><dc:creator><![CDATA[jsbach]]></dc:creator><pubDate>Sun, 30 Mar 2008 12:53:41 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 13:24:57 GMT]]></title><description><![CDATA[<p>jsbach schrieb:</p>
<blockquote>
<p>Wozu ist Klassenemplate gut, wenn es keine dynamische Parametrisierung<br />
unterstuetzt?</p>
</blockquote>
<p>Zum Beispiel bei der Verwendung in std::vector? Es geht darum, bestimmte Dinge allgemein zu programmieren, z.B. eine Container-Klasse, aber nicht darum, dynamische Elemente der Sprache hinzuzufügen. Dafür gibt es Polymorphie und Speicherreservierung mit <em>new</em>.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483122</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483122</guid><dc:creator><![CDATA[[[global:guest]]]]></dc:creator><pubDate>Sun, 30 Mar 2008 13:24:57 GMT</pubDate></item><item><title><![CDATA[Reply to Pointer auf Klasse aus Template on Sun, 30 Mar 2008 13:29:18 GMT]]></title><description><![CDATA[<blockquote>
<p>Wozu ist Klassenemplate gut, wenn es keine dynamische Parametrisierung<br />
unterstuetzt?</p>
</blockquote>
<p>Man kann sehr viele schöne Sachen damit machen.</p>
<p>Ein kleines Beispiel, dass hier auch schön zum Thema passt.</p>
<p>Wenn du den vector betrachtest wirst du merken, dass er einige Vorteile gegenüber dem normalen array hat.Zum Beispiel das Iterator Interface.</p>
<p>Ich finds toll, dass ich beim vector einfach schreiben kann:</p>
<pre><code class="language-cpp">//...
typedef std::vector&lt;int&gt; Container;
typedef Container::iterator Iterator;
Container vec,vec2;
//...
//alle objekte aus vec nach vec2 bis zu einem bestimmten element suchen
Iterator pos=find(vec.begin(),vec.end(),foo);
std::copy(vec.begin(),vec.pos(),std::back_insert_iterator(vec2));
</code></pre>
<p>mit nem array ist das nicht ganz so schön</p>
<pre><code class="language-cpp">int vec[10];
//...
int* pos=find(vec,vec+10,foo);
//usw
</code></pre>
<p>Gut, vielleicht siehts auf dem ersten Blick schöner aus ;). Das Problem ist,dass wenn du die größe des array änderst, du das auch in find machen musst. Und das ist fehleranfällig.</p>
<p>Deshalb haben findige Programmierer einen array wrapper geschrieben. verhält sich haargenau wie ein array, aber hat das Iterator Interface</p>
<pre><code class="language-cpp">typedef array&lt;int,10&gt; Container;
typedef Container::iterator Iterator;
Container vec;
//...
Iterator pos=find(vec.begin(),vec.end(),foo);
//usw
</code></pre>
<p>Und zum Beispiel genau hier brauchst du diese template argumente, denn überall wo du vorher ein statisches array genutzt hast, kannst du jetzt diese Klasse nutzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1483127</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1483127</guid><dc:creator><![CDATA[otze]]></dc:creator><pubDate>Sun, 30 Mar 2008 13:29:18 GMT</pubDate></item></channel></rss>