<?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[Zeiger&#x2F;Referenz bei Operatoren]]></title><description><![CDATA[<p>Ich habe folgenden Code:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Array
{
    public:
        T* operator[](int index)
        {
            return ...;
        }

};

int main(...)
{    
    Array&lt;int&gt; *a = new Array&lt;int&gt;();
    //fülle a
    std::cout &lt;&lt; *(*a)[1] &lt;&lt; std::endl;

    Array&lt;int&gt; b;
    //fülle b
    std::cout &lt;&lt; b[1] &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>Nun meine Frage dazu: Arbeiten die Operatoren immer auf Objekten, also nicht auf Zeigern? Muss ich dafür sorgen, dass ich niemals einen Operator auf einen Zeiger anwende? Also etwa:</p>
<pre><code class="language-cpp">Array&lt;int&gt; *a = new Array&lt;int&gt;();
//fülle a
std::cout &lt;&lt; a[1] &lt;&lt; std::endl;
</code></pre>
<p>Inwiefern liege ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/132517/zeiger-referenz-bei-operatoren</link><generator>RSS for Node</generator><lastBuildDate>Thu, 27 Aug 2026 12:17:21 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/132517.rss" rel="self" type="application/rss+xml"/><pubDate>Wed, 11 Jan 2006 14:03:01 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 14:03:01 GMT]]></title><description><![CDATA[<p>Ich habe folgenden Code:</p>
<pre><code class="language-cpp">template&lt;typename T&gt;
class Array
{
    public:
        T* operator[](int index)
        {
            return ...;
        }

};

int main(...)
{    
    Array&lt;int&gt; *a = new Array&lt;int&gt;();
    //fülle a
    std::cout &lt;&lt; *(*a)[1] &lt;&lt; std::endl;

    Array&lt;int&gt; b;
    //fülle b
    std::cout &lt;&lt; b[1] &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>Nun meine Frage dazu: Arbeiten die Operatoren immer auf Objekten, also nicht auf Zeigern? Muss ich dafür sorgen, dass ich niemals einen Operator auf einen Zeiger anwende? Also etwa:</p>
<pre><code class="language-cpp">Array&lt;int&gt; *a = new Array&lt;int&gt;();
//fülle a
std::cout &lt;&lt; a[1] &lt;&lt; std::endl;
</code></pre>
<p>Inwiefern liege ich falsch?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963608</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963608</guid><dc:creator><![CDATA[Marc++]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:03:01 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 14:20:46 GMT]]></title><description><![CDATA[<p>Du kannst zurückgeben, was immer du willst <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="😉"
    /> Nur mußt du auf der anderen Seite wissen, wie du damit umzugehen hast.</p>
<p>PS: &quot;Normale&quot; Operatoren geben übrigens Referenzen (oder konstante Referenzen) oder Objekte zurück.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963635</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963635</guid><dc:creator><![CDATA[CStoll (off)]]></dc:creator><pubDate>Wed, 11 Jan 2006 14:20:46 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 15:02:27 GMT]]></title><description><![CDATA[<p>Marc++ schrieb:</p>
<blockquote>
<p>Nun meine Frage dazu: Arbeiten die Operatoren immer auf Objekten, also nicht auf Zeigern?</p>
</blockquote>
<p>Ja (bzw. auf Referenzen). Zeiger sind eingebaute Datentypen und haben fest definierte Operatoren (*, -&gt;, [], +, -, ++, -- usw.).</p>
<blockquote>
<p>Muss ich dafür sorgen, dass ich niemals einen Operator auf einen Zeiger anwende? Also etwa:</p>
<pre><code class="language-cpp">Array&lt;int&gt; *a = new Array&lt;int&gt;();
//fülle a
std::cout &lt;&lt; a[1] &lt;&lt; std::endl;
</code></pre>
</blockquote>
<p>Ich verstehe die Frage nicht ganz, aber ich kann dir erklären, was dein Code macht: Da a ein Zeiger ist, ist a[1] ein ganz normaler Array-Zugriff. Nun ist das dahinterliegende &quot;Array&quot; aber lediglich von der Länge 1, dein Zeiger zeigt nur auf eine Instanz vom Typ Array&lt;int&gt;, so dass obige Code undefiniertes Verhalten zeigt (BTW es ist ein bisschen verwirrend, dass hier &quot;Array&quot; in zwei Bedeutungen auftaucht. Ich hoffe du kommst damit klar, schließlich ist das auf deinem Mist gewachsen :p ).<br />
Wenn du den von deiner Klasse überladenen operator[] ansprechen willst, musst du wie gehabt a dereferenzieren: (*a)[1].</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963691</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963691</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 11 Jan 2006 15:02:27 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 15:09:28 GMT]]></title><description><![CDATA[<p>Ich glaube ich habe mich unverständlich ausgedrückt. Ich habe mir mal ein anderes Beispiel überlegt:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;string&gt;

class Complex
{
    public:
        double re;
        double im;

        Complex(double re=0, double im=0)
            : re(re), im(im) {}

        ~Complex(){}

        Complex operator+(const Complex &amp;rval)
        {
            Complex c(re+rval.re, im+rval.im);
            return c;
        }

        Complex operator+(const Complex *rval)
        {
            Complex c(re+rval-&gt;re, im+rval-&gt;im);
            return c;
        }
};

std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, Complex &amp;c)
{
    os &lt;&lt; &quot;re: &quot; &lt;&lt; c.re &lt;&lt; &quot;, im: &quot; &lt;&lt; c.im;
    return os;
}

int main(int argc, char **argv)
{
    Complex c1(10,50);
    Complex c2(2, 5);

    c1 = c1 + c2;
    std::cout &lt;&lt; c1 &lt;&lt; std::endl;

    Complex *c3 = new Complex(100, 200);
    c1 = c2 + c3;
    std::cout &lt;&lt; c1 &lt;&lt; std::endl;

    c1 = c3 + c3;   //Fehler! c3 + c2 dürfte ebenfalls nicht gehen!
    std::cout &lt;&lt; c1 &lt;&lt; std::endl;
    return 0;
}
</code></pre>
<p>Wenn ich das richtig sehe, habe ich keine Möglichkeit einen einen Op auf einem Zeiger operieren zu lassen. Also das die linke Seite des Operators ein Zeiger ist.</p>
<p>Ich hoffe diesesmal habe ich es verständlicher ausgedrückt. <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/963706</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963706</guid><dc:creator><![CDATA[Marc++]]></dc:creator><pubDate>Wed, 11 Jan 2006 15:09:28 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 15:16:03 GMT]]></title><description><![CDATA[<p>Doch, du könntest schon, solltest jedoch nicht:</p>
<pre><code class="language-cpp">Complex Complex::operator+(Complex* other)
{...}

...
Complex c1,c2;
Complex c3 = c1 + &amp;c2; //benötigt &quot;&amp;&quot;, um einen Complex* zu bekommen
</code></pre>
<p>Um als linken Operand einen Zeiger zu verwenden, benötigst du eine globale Funktion.</p>
<p>PS: Und mindestens einer der Operanden muß ein User-definierter Typ sein, sonst kommst du in Konflikt mit den integrierten Operatoren.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963722</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963722</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Wed, 11 Jan 2006 15:16:03 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 17:29:02 GMT]]></title><description><![CDATA[<p>Meine Fragen hören leider nicht auf, aber ich hoffe ich habe alles verstanden!</p>
<p>Ich habe die Complex Klasse eben nocheinmal erweitert:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;ostream&gt;
#include &lt;string&gt;

class Complex
{
    public:
        double re;
        double im;

        Complex(double re=0, double im=0)
            : re(re), im(im) {}

        ~Complex(){}

        Complex operator+(const Complex &amp;rval)
        {
            Complex c(re+rval.re, im+rval.im);
            return c;
        }

        Complex operator*(const Complex &amp;rval)
        {
            Complex c(re*rval.re, im*rval.im);
            return c;
        }

        Complex&amp; operator++()
        {
            ++re;
            ++im;
            return *this;
        }

        Complex operator++(int dummy)
        {
            Complex c = *this;
            ++re;
            ++im;
            return c;
        }
};

std::ostream&amp; operator&lt;&lt;(std::ostream &amp;os, Complex &amp;c)
{
    os &lt;&lt; &quot;re: &quot; &lt;&lt; c.re &lt;&lt; &quot;, im: &quot; &lt;&lt; c.im;
    return os;
}

int main(int argc, char **argv)
{
    Complex c1(10,50);
    Complex c2(2, 5);

    c1 = c1 + c2;
    std::cout &lt;&lt; &quot;c1 + c2 = &quot; &lt;&lt; c1 &lt;&lt; std::endl;

    c1 = c1 * c2;
    std::cout &lt;&lt; &quot;c1 * c2 = &quot; &lt;&lt; c1 &lt;&lt; std::endl;

    std::cout &lt;&lt; &quot;++c1 = &quot; &lt;&lt; ++c1 &lt;&lt; std::endl;
    std::cout &lt;&lt; &quot;c1++ = &quot; &lt;&lt; c1++ &lt;&lt; std::endl;    //Warum klappt das nicht?
    std::cout &lt;&lt; &quot;nach c1++ = &quot; &lt;&lt; c1 &lt;&lt; std::endl;

    return 0;
}
</code></pre>
<p>Ich habe mich auch nochmal mit den unären Operatoren auseinander gesetzt. Soweit so gut. Jedoch erhalte ich den oben kommentierten Fehler. Nur frage ich mich warum? Ich gebe von dem Objekt eine Kopie zurück, da in dieser Form der Inkrement ja erst nach der Rückgabe erfolgt. Dem op&lt;&lt; dürfte es doch ziemlich egal sein, ob ++ eine Referenz oder ein Objekt zurückgegeben hat?!?</p>
<p>Danke! <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/963861</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963861</guid><dc:creator><![CDATA[Marc++]]></dc:creator><pubDate>Wed, 11 Jan 2006 17:29:02 GMT</pubDate></item><item><title><![CDATA[Reply to Zeiger&#x2F;Referenz bei Operatoren on Wed, 11 Jan 2006 17:35:50 GMT]]></title><description><![CDATA[<p>Du kannst keine nicht-const-Referenz an ein temporäres Objekt binden. Das ist hier aber auch gar nicht notwendig, deklarier den zweiten Parameter im operator&lt;&lt; doch als const-Referenz.</p>
<p>(über den Unsinn eines operator++ in einer Klasse für komplexe Zahlen sag ich jetzt lieber nichts)</p>
]]></description><link>https://www.c-plusplus.net/forum/post/963867</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/963867</guid><dc:creator><![CDATA[Bashar]]></dc:creator><pubDate>Wed, 11 Jan 2006 17:35:50 GMT</pubDate></item></channel></rss>