<?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[Überladen des Operator[] bei template]]></title><description><![CDATA[<p>Guten Tag nette c-plusplus Foren Member.</p>
<p><strong>Zur Vorgeschichte:</strong><br />
Ich hab nach (<a href="http://fatman98.fa.funpic.de/builder_array.php" rel="nofollow">http://fatman98.fa.funpic.de/builder_array.php</a>) von f98 immer die<br />
Dynamischen Arrays mit &quot;DynamicArray&lt;TYP&gt;&quot; benutzt.<br />
Fand es aber irgendwie Umständlich immer den DynamicArray einsatzbereit zu machen<br />
und Werte hinzuzufügen.</p>
<pre><code class="language-cpp">DynamicArray&lt;TYP&gt; dArray;
dArray.Length=1;
dArray[dArray.Length-1]=WERT;
</code></pre>
<p>Also habe ich eine Klasse geschrieben die diese per &quot;Add&quot; Funktion<br />
automatisch regelt. Als ich diese Klasse für String und int geschrieben<br />
und festgestellt hatte, das sich außer den TYP nicht verändert am Code,<br />
viel mir ein das es ja sowas nettes wie templates gibt.</p>
<p>Nach ein bisschen Try&amp;Error Verfahren (Ich liebe dieses Verfahren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    />) kam dann letzlich das heraus:</p>
<pre><code class="language-cpp">// Klasse
template &lt;class T&gt;
class TDynArray
{
public:
    TDynArray(){this-&gt;Length=0;}
    ~TDynArray(){this-&gt;Length=0;}
//---------------------------------------------------------------------------
    DynamicArray&lt;T&gt; Data;
//---------------------------------------------------------------------------
    __property int Length = {read=get_length, write=set_length};
//---------------------------------------------------------------------------
    void Add(T AddData){
        this-&gt;Data [this-&gt;Length]=AddData;
        this-&gt;Length++;
    }
//---------------------------------------------------------------------------
private:
    int Counter;
//---------------------------------------------------------------------------
    bool is_inRage(int Index){
        return (Index&lt;=this-&gt;Length&amp;&amp;Index&gt;=0);
    }
//---------------------------------------------------------------------------
    int  get_length(){
        return this-&gt;Counter;
    }
//---------------------------------------------------------------------------
    void set_length(int l){
        this-&gt;Counter = l;
        this-&gt;Data.Length = l+1;
    }
//---------------------------------------------------------------------------
};
</code></pre>
<p>Meine Test mit der TDynArray Klasse:</p>
<pre><code class="language-cpp">TDynArray&lt;AnsiString&gt; * Test=new TDynArray&lt;AnsiString&gt;();
    Test-&gt;Add(&quot;Ich Teste&quot;);
    Test-&gt;Add(&quot;den Dyn.&quot;);
    Test-&gt;Add(&quot;Array&quot;);
    for(int i=0;i&lt;Test-&gt;Length;i++)
    Memo1-&gt;Lines-&gt;Add(Test-&gt;Data[i]);
</code></pre>
<p>So das Funktioniert auch Prächtig.</p>
<p><strong>Problem:</strong><br />
So, da ich finde das der Aufruf &quot;Test-&gt;Data[i]&quot; länger ist wie &quot;Test[i]&quot;<br />
würde ich gerne den Operator[] überladen.<br />
Dabei hab ich mir gedacht das müsst über diese Struktur funktionieren:</p>
<pre><code class="language-cpp">T operator[](int index){
        if(this-&gt;is_inRage(index))return this-&gt;Data[index];
        return NULL;
    }
</code></pre>
<p>Der Kompiler meckert auch in der Klasse nicht darüber.</p>
<p>Allerdings wenn ich meine Test Funtkion mit</p>
<pre><code class="language-cpp">AnsiString wtf=Test[0];
</code></pre>
<p>erweitere meckert der Kompiler mit:</p>
<blockquote>
<p>[BCC32 Fehler] Unit2.cpp(512): E2285 Keine Übereinstimmung für 'AnsiString::AnsiString(const AnsiString&amp;)' gefunden</p>
</blockquote>
<p>Wenn das beantwortet wurde, wäre natürlich die Frage:<br />
Wie müsste die Struktur aussehen wenn man direkt über [] setzen kann.</p>
<pre><code class="language-cpp">Test[0]=&quot;Test&quot;;
</code></pre>
<p>Nur noch mal als Hinweis: Ich habe noch nicht wirklich mit Operatoren<br />
Überladungen gearbeitet. Zwar hab ich schon ein Paar Klassen mit<br />
Überladungen getestet, aber keine war im Bezug auf ein template.</p>
<p>Danke im Voraus für die Konstruktive Kritik und Code Erweiterungen ;&gt;</p>
<p>mfg Paule</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/195416/überladen-des-operator-bei-template</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 08:37:01 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/195416.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 17 Oct 2007 12:06:30 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Überladen des Operator[] bei template on Wed, 17 Oct 2007 12:06:30 GMT]]></title><description><![CDATA[<p>Guten Tag nette c-plusplus Foren Member.</p>
<p><strong>Zur Vorgeschichte:</strong><br />
Ich hab nach (<a href="http://fatman98.fa.funpic.de/builder_array.php" rel="nofollow">http://fatman98.fa.funpic.de/builder_array.php</a>) von f98 immer die<br />
Dynamischen Arrays mit &quot;DynamicArray&lt;TYP&gt;&quot; benutzt.<br />
Fand es aber irgendwie Umständlich immer den DynamicArray einsatzbereit zu machen<br />
und Werte hinzuzufügen.</p>
<pre><code class="language-cpp">DynamicArray&lt;TYP&gt; dArray;
dArray.Length=1;
dArray[dArray.Length-1]=WERT;
</code></pre>
<p>Also habe ich eine Klasse geschrieben die diese per &quot;Add&quot; Funktion<br />
automatisch regelt. Als ich diese Klasse für String und int geschrieben<br />
und festgestellt hatte, das sich außer den TYP nicht verändert am Code,<br />
viel mir ein das es ja sowas nettes wie templates gibt.</p>
<p>Nach ein bisschen Try&amp;Error Verfahren (Ich liebe dieses Verfahren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f60b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_savoring_food"
      title=":yum:"
      alt="😋"
    />) kam dann letzlich das heraus:</p>
<pre><code class="language-cpp">// Klasse
template &lt;class T&gt;
class TDynArray
{
public:
    TDynArray(){this-&gt;Length=0;}
    ~TDynArray(){this-&gt;Length=0;}
//---------------------------------------------------------------------------
    DynamicArray&lt;T&gt; Data;
//---------------------------------------------------------------------------
    __property int Length = {read=get_length, write=set_length};
//---------------------------------------------------------------------------
    void Add(T AddData){
        this-&gt;Data [this-&gt;Length]=AddData;
        this-&gt;Length++;
    }
//---------------------------------------------------------------------------
private:
    int Counter;
//---------------------------------------------------------------------------
    bool is_inRage(int Index){
        return (Index&lt;=this-&gt;Length&amp;&amp;Index&gt;=0);
    }
//---------------------------------------------------------------------------
    int  get_length(){
        return this-&gt;Counter;
    }
//---------------------------------------------------------------------------
    void set_length(int l){
        this-&gt;Counter = l;
        this-&gt;Data.Length = l+1;
    }
//---------------------------------------------------------------------------
};
</code></pre>
<p>Meine Test mit der TDynArray Klasse:</p>
<pre><code class="language-cpp">TDynArray&lt;AnsiString&gt; * Test=new TDynArray&lt;AnsiString&gt;();
    Test-&gt;Add(&quot;Ich Teste&quot;);
    Test-&gt;Add(&quot;den Dyn.&quot;);
    Test-&gt;Add(&quot;Array&quot;);
    for(int i=0;i&lt;Test-&gt;Length;i++)
    Memo1-&gt;Lines-&gt;Add(Test-&gt;Data[i]);
</code></pre>
<p>So das Funktioniert auch Prächtig.</p>
<p><strong>Problem:</strong><br />
So, da ich finde das der Aufruf &quot;Test-&gt;Data[i]&quot; länger ist wie &quot;Test[i]&quot;<br />
würde ich gerne den Operator[] überladen.<br />
Dabei hab ich mir gedacht das müsst über diese Struktur funktionieren:</p>
<pre><code class="language-cpp">T operator[](int index){
        if(this-&gt;is_inRage(index))return this-&gt;Data[index];
        return NULL;
    }
</code></pre>
<p>Der Kompiler meckert auch in der Klasse nicht darüber.</p>
<p>Allerdings wenn ich meine Test Funtkion mit</p>
<pre><code class="language-cpp">AnsiString wtf=Test[0];
</code></pre>
<p>erweitere meckert der Kompiler mit:</p>
<blockquote>
<p>[BCC32 Fehler] Unit2.cpp(512): E2285 Keine Übereinstimmung für 'AnsiString::AnsiString(const AnsiString&amp;)' gefunden</p>
</blockquote>
<p>Wenn das beantwortet wurde, wäre natürlich die Frage:<br />
Wie müsste die Struktur aussehen wenn man direkt über [] setzen kann.</p>
<pre><code class="language-cpp">Test[0]=&quot;Test&quot;;
</code></pre>
<p>Nur noch mal als Hinweis: Ich habe noch nicht wirklich mit Operatoren<br />
Überladungen gearbeitet. Zwar hab ich schon ein Paar Klassen mit<br />
Überladungen getestet, aber keine war im Bezug auf ein template.</p>
<p>Danke im Voraus für die Konstruktive Kritik und Code Erweiterungen ;&gt;</p>
<p>mfg Paule</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387130</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387130</guid><dc:creator><![CDATA[_Paule]]></dc:creator><pubDate>Wed, 17 Oct 2007 12:06:30 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen des Operator[] bei template on Wed, 17 Oct 2007 12:27:47 GMT]]></title><description><![CDATA[<p>Hallo</p>
<ol>
<li></li>
</ol>
<p>Da Test ja ein Pointer auf eine Instanz ist, must du den Pointer erstmal dereferenzieren.</p>
<pre><code class="language-cpp">AnsiString wtf=(*Test)[0];
</code></pre>
<ol start="2">
<li></li>
</ol>
<p>Damit du mit dem []-Op auch Werte verändern kannst must du eine Referenz übergeben</p>
<pre><code class="language-cpp">T&amp; operator[](int index){
        if(this-&gt;is_inRage(index))return this-&gt;Data[index];
        return NULL;
    }
</code></pre>
<p>Daraus ergibt sich aber das Problem der const-Correctness, so das du besser zwei Operatoren anbieten solltest</p>
<pre><code class="language-cpp">const T&amp; operator[](int index) const{
        if(this-&gt;is_inRage(index))return this-&gt;Data[index];
        return NULL;
    }
T&amp; operator[](int index){
        if(this-&gt;is_inRage(index))return this-&gt;Data[index];
        return NULL;
    }
</code></pre>
<p>3. Du solltest deine Klasse nur als Test betrachten. Und für den reallen einsatz lieber std::vector nehmen, das ist nämlich genau das was du machen willst, nur schon fertig, umfangreicher und effizienter <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="😉"
    /><br />
Siehe dazu auch den Magazin-Artikel hier im Forum zu den STL-Containern.</p>
<p>4. Der Sinn bei solchen dynamischen Containern ist das die Container selber auf dem Stack angelegt werden, die Elemente aber auch dem Heap.<br />
Deshalb sollte (auch bei std::vector) das eher so aussehen :</p>
<pre><code class="language-cpp">DynArray Test();
Test.Add(&quot;Neu&quot;);
</code></pre>
<p>Den Container selber auf den Heap (Pointer, new...) sollte man nur machen wenn es wirklich notwendig ist, und das sollte es in den wenigsten Fällen.</p>
<p>bis bald<br />
akari</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387142</guid><dc:creator><![CDATA[akari]]></dc:creator><pubDate>Wed, 17 Oct 2007 12:27:47 GMT</pubDate></item><item><title><![CDATA[Reply to Überladen des Operator[] bei template on Wed, 17 Oct 2007 12:40:26 GMT]]></title><description><![CDATA[<p>Hallo zurück.</p>
<p>Huch das ging ja schnell.</p>
<p>Danke akari mit dem dereferenzieren klappt das wunderbar,<br />
ist jetzt mein neues Lieblingswort <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>
<p>Danke für die Code-Verbesserungen und für den Hinweis<br />
mit dem STL, ich werd es mir mal anschauen.</p>
<p>mfg<br />
Paule</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1387159</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1387159</guid><dc:creator><![CDATA[_Paule]]></dc:creator><pubDate>Wed, 17 Oct 2007 12:40:26 GMT</pubDate></item></channel></rss>