<?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[Problem mit Template + virtual function]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich hoffe Ihr könnt mir weiterhelfen. Ich habe folgende Template Klasse...</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Sort
{
  static Sort&lt;T&gt;* SortArray;

  static void QuickSort(int Left, int Right);

  public:

  virtual T* GetSortingValue();

  static void QuickSort(Sort&lt;T&gt;* Array, int Left, int Right);
};

template &lt;class T&gt;
Sort&lt;T&gt;* Sort&lt;T&gt;::SortArray= NULL;

template &lt;class T&gt;
T* Sort&lt;T&gt;::GetSortingValue()
{
  static T dummy;
  return &amp;dummy;
}

template &lt;class T&gt;
void Sort&lt;T&gt;::QuickSort(Sort&lt;T&gt;* Array, int Left, int Right)
{
  SortArray= Array;
  QuickSort(Left, Right);
}

template &lt;class T&gt;
void Sort&lt;T&gt;::QuickSort(int Left, int Right)
{
  Sort&lt;T&gt;* obj= &amp;SortArray[(Left + Right) &gt;&gt; 1];
  T* Piv= obj-&gt;GetSortingValue();
  //...
}
</code></pre>
<p>...und folgende Klasse die davon erbt...</p>
<pre><code class="language-cpp">class SortSub : public Sort&lt;float&gt;
{              
  // irgendwelche Variablen
};
</code></pre>
<p>...und dann den folgenden Aufruf...</p>
<pre><code class="language-cpp">static SortSub* SortSubArray;

Sort&lt;float&gt;::QuickSort(SortSubArray, 0, 4);
</code></pre>
<p>Leider knallt es immer an der Stelle...</p>
<p><em><em>T</em> Piv= obj-&gt;GetSortingValue();</em>*</p>
<p>...<a href="http://s3.directupload.net/images/080826/xyx3m58n.png" rel="nofollow">mit dieser Fehlermeldung</a> (unhandled exception, access writing violation...)</p>
<p>Irgendwie kann er die virtuelle Methode nicht aufrufen,<br />
aber ich weiß nicht was da los ist. Bitte helft mir! Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/221251/problem-mit-template-virtual-function</link><generator>RSS for Node</generator><lastBuildDate>Tue, 06 Oct 2026 05:54:54 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/221251.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 26 Aug 2008 21:45:45 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Problem mit Template + virtual function on Tue, 26 Aug 2008 21:45:45 GMT]]></title><description><![CDATA[<p>Hallo Forum,</p>
<p>ich hoffe Ihr könnt mir weiterhelfen. Ich habe folgende Template Klasse...</p>
<pre><code class="language-cpp">template &lt;class T&gt;
class Sort
{
  static Sort&lt;T&gt;* SortArray;

  static void QuickSort(int Left, int Right);

  public:

  virtual T* GetSortingValue();

  static void QuickSort(Sort&lt;T&gt;* Array, int Left, int Right);
};

template &lt;class T&gt;
Sort&lt;T&gt;* Sort&lt;T&gt;::SortArray= NULL;

template &lt;class T&gt;
T* Sort&lt;T&gt;::GetSortingValue()
{
  static T dummy;
  return &amp;dummy;
}

template &lt;class T&gt;
void Sort&lt;T&gt;::QuickSort(Sort&lt;T&gt;* Array, int Left, int Right)
{
  SortArray= Array;
  QuickSort(Left, Right);
}

template &lt;class T&gt;
void Sort&lt;T&gt;::QuickSort(int Left, int Right)
{
  Sort&lt;T&gt;* obj= &amp;SortArray[(Left + Right) &gt;&gt; 1];
  T* Piv= obj-&gt;GetSortingValue();
  //...
}
</code></pre>
<p>...und folgende Klasse die davon erbt...</p>
<pre><code class="language-cpp">class SortSub : public Sort&lt;float&gt;
{              
  // irgendwelche Variablen
};
</code></pre>
<p>...und dann den folgenden Aufruf...</p>
<pre><code class="language-cpp">static SortSub* SortSubArray;

Sort&lt;float&gt;::QuickSort(SortSubArray, 0, 4);
</code></pre>
<p>Leider knallt es immer an der Stelle...</p>
<p><em><em>T</em> Piv= obj-&gt;GetSortingValue();</em>*</p>
<p>...<a href="http://s3.directupload.net/images/080826/xyx3m58n.png" rel="nofollow">mit dieser Fehlermeldung</a> (unhandled exception, access writing violation...)</p>
<p>Irgendwie kann er die virtuelle Methode nicht aufrufen,<br />
aber ich weiß nicht was da los ist. Bitte helft mir! Danke!!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1571962</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1571962</guid><dc:creator><![CDATA[Beginner2k8]]></dc:creator><pubDate>Tue, 26 Aug 2008 21:45:45 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Tue, 26 Aug 2008 23:07:02 GMT]]></title><description><![CDATA[<p>wird SortSubArray auch irgendwo geeignet initialisiert?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1571970</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1571970</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Tue, 26 Aug 2008 23:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 09:13:21 GMT]]></title><description><![CDATA[<p>Hallo!</p>
<p>Ich habe mir vor dem Thread hier im Debugger den <strong>obj</strong> pointer ausgeben lassen<br />
und er zeigte auf Daten. Allerdings bin ich durch Euren Hinweis darauf gekommen das<br />
der SortSubArray ja nur mit realloc() erzeugt wird (kann dynamisch wachsen).</p>
<pre><code class="language-cpp">realloc(SortSubArray, 5 * sizeof(SortSub));
</code></pre>
<p>D.h. die einzelnen SortSub Elemente des Arrays werden nicht über <strong>new</strong> erzeugt.</p>
<p>Kann das irgendwie daran liegen? Das ich nur den Platz für die Objekte erzeuge<br />
aber eben nicht über &quot;new&quot;? Und wenn ja warum genau nochmal ist das so?<br />
Einen Konstruktor habe ich ja eigentlich nicht der durch new aufgerufen werden müßte.</p>
<p>Vielen Dank!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572088</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572088</guid><dc:creator><![CDATA[Beginner2k8]]></dc:creator><pubDate>Wed, 27 Aug 2008 09:13:21 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 09:46:42 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Beginner2k8 schrieb:</p>
<blockquote>
<p>Allerdings bin ich durch Euren Hinweis darauf gekommen das<br />
der SortSubArray ja nur mit realloc() erzeugt wird (kann dynamisch wachsen).</p>
</blockquote>
<p>Nur <em>realloc</em>? Dann ist zu beachten, dass jeder <em>realloc</em> übergebene Zeiger entweder <em>NULL</em> (verhält sich dann wie <em>malloc</em>) oder ein von einem vorherigen Aufruf der Speicherreservierungs-Funktionen erhaltener Zeiger sein muss.</p>
<p>MfG,</p>
<p>Probe-Nutzer</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572115</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572115</guid><dc:creator><![CDATA[Probe-Nutzer]]></dc:creator><pubDate>Wed, 27 Aug 2008 09:46:42 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 09:54:52 GMT]]></title><description><![CDATA[<p>Beginner2k8 schrieb:</p>
<blockquote>
<p>Hallo!</p>
<p>Ich habe mir vor dem Thread hier im Debugger den <strong>obj</strong> pointer ausgeben lassen<br />
und er zeigte auf Daten. Allerdings bin ich durch Euren Hinweis darauf gekommen das<br />
der SortSubArray ja nur mit realloc() erzeugt wird (kann dynamisch wachsen).</p>
<pre><code class="language-cpp">realloc(SortSubArray, 5 * sizeof(SortSub));
</code></pre>
<p>D.h. die einzelnen SortSub Elemente des Arrays werden nicht über <strong>new</strong> erzeugt.</p>
</blockquote>
<p>vergiss realloc. realloc=evil zumal ich noch nie überzeugend demonstriert bekommen habe, dass die Fähigkeit, einen Speicherblock direkt vergrößern zu können, in hinreichend komplexen Programmen signifikant oft genutzt werden kann.</p>
<blockquote>
<p>Kann das irgendwie daran liegen? Das ich nur den Platz für die Objekte erzeuge<br />
aber eben nicht über &quot;new&quot;? Und wenn ja warum genau nochmal ist das so?<br />
Einen Konstruktor habe ich ja eigentlich nicht der durch new aufgerufen werden müßte.</p>
</blockquote>
<p>Irgendwie, schon. Weil Sort&lt;T&gt; kein POD ist. Sort&lt;T&gt; besitzt tatsächlich sogar zwei Konstruktoren, und einen davon muss du zur Erzeugung benutzen.</p>
<p>Wenn du schon anfängst, mit Templates herumzuspielen, sollte doch nichts gegen vector &amp; co sprechen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572118</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572118</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Wed, 27 Aug 2008 09:54:52 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 11:02:23 GMT]]></title><description><![CDATA[<p>Kleine Korrektur, so mache ich es:</p>
<pre><code class="language-cpp">SortSubArray = realloc(SortSubArray, 5 * sizeof(SortSub));
</code></pre>
<p>D.h. die Exception kommt daher, das ich die einzelnen elemente nicht mit new<br />
erzeugt habe... okay dann werde ich das mal ändern. Danke!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572137</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572137</guid><dc:creator><![CDATA[Beginner2k8]]></dc:creator><pubDate>Wed, 27 Aug 2008 11:02:23 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 11:15:53 GMT]]></title><description><![CDATA[<p>malloc und Konsorte mischt man besser nicht mit new und Konsorte.<br />
Simon</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572148</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572148</guid><dc:creator><![CDATA[simon.gysi]]></dc:creator><pubDate>Wed, 27 Aug 2008 11:15:53 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 11:19:55 GMT]]></title><description><![CDATA[<p>simon.gysi schrieb:</p>
<blockquote>
<p>malloc und Konsorte mischt man besser nicht mit new und Konsorte.<br />
Simon</p>
</blockquote>
<p>Er hats auch nicht gemischt (steht da zumindest nicht), aber er hat die Ctoren dür die Arrayelemente nicht aufgerufen.<br />
malloc &amp; Co sollte man in C++ generell garnicht nutzen, eben aus diesem Grund. Seltene Ausnahmen (z.B. implementieren eines eigenen operator new) bestätigen wie immer die Regel.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572150</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Wed, 27 Aug 2008 11:19:55 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 18:56:37 GMT]]></title><description><![CDATA[<p>Habe jetzt den Array so geändert...</p>
<pre><code class="language-cpp">static SortSub** SortSubArray;
</code></pre>
<p>...und jedes Element (welche nun Pointer sind) mit <strong>new</strong> erzeugt.</p>
<p>Jetzt funktioniert alles! <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>Jetzt kann ich mit dem Template Parameter einstellen, von welchem<br />
Typ die zu vergleichende Variable eines sortierbaren (d.h. von<br />
class Sort abgeleiteten) Objekts ist <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1572529</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572529</guid><dc:creator><![CDATA[Beginner2k8]]></dc:creator><pubDate>Wed, 27 Aug 2008 18:56:37 GMT</pubDate></item><item><title><![CDATA[Reply to Problem mit Template + virtual function on Wed, 27 Aug 2008 19:15:41 GMT]]></title><description><![CDATA[<p>Beginner2k8 schrieb:</p>
<blockquote>
<pre><code class="language-cpp">static SortSub** SortSubArray;
</code></pre>
</blockquote>
<p>Ich habe jetzt nicht den ganzen Thread verfolgt, aber das graust mich schon zu sehen. Bist du sicher, dass das nötig ist? Oder doch besser mit std::vector arbeiten?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1572537</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1572537</guid><dc:creator><![CDATA[drakon]]></dc:creator><pubDate>Wed, 27 Aug 2008 19:15:41 GMT</pubDate></item></channel></rss>