<?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[Operator Overloading]]></title><description><![CDATA[<p>Hallo,</p>
<p>Übe mich momentan im Operator Overloading, dazu wollte ich mal ne Bruch-Klasse schreiben, doch schon bei der Multiplikation von Brüchen wirft mein Compiler einen Error:</p>
<pre><code class="language-cli">invalid operands of types `Bruch*' and `Bruch*' to binary `operator*'
</code></pre>
<p>Hier ist mein Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Bruch {
      public:
             Bruch(int zaehler = 1, int nenner = 1) : m_zaehler(zaehler), m_nenner(nenner) {}
             void Display() const {
                  cout &lt;&lt; m_zaehler &lt;&lt; &quot;/&quot; &lt;&lt; m_nenner &lt;&lt; endl;
             }
             int GetZaehler() const { return m_zaehler; }
             int GetNenner() const { return m_nenner; }
             Bruch* operator*(Bruch* otherBruch) {
                   int new_zaehler, new_nenner;
                   new_nenner = otherBruch-&gt;GetNenner() * this-&gt;GetNenner();
                   new_zaehler = otherBruch-&gt;GetZaehler() * this-&gt;GetZaehler();
                   Bruch* bruch = new Bruch(new_zaehler, new_nenner);
                   return bruch;
             }  
      private:
              int m_zaehler, m_nenner;
};

int main() {
    Bruch* bruch = new Bruch(3, 5);
    Bruch* bruch_2 = new Bruch(3, 5);
    Bruch* bruch_3 = bruch * bruch_2;

    int x;
    cin &gt;&gt; x;
    return 0;
}
</code></pre>
<p>Freue mich über jede Hilfe und bedankte mich schonmal im Voraus.</p>
<p>Achja, ist das was ich mache eigentlich effizient? Oder sollte man das ganze anderst lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/255364/operator-overloading</link><generator>RSS for Node</generator><lastBuildDate>Sat, 12 Sep 2026 02:12:46 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/255364.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 29 Nov 2009 19:44:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 19:44:00 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Übe mich momentan im Operator Overloading, dazu wollte ich mal ne Bruch-Klasse schreiben, doch schon bei der Multiplikation von Brüchen wirft mein Compiler einen Error:</p>
<pre><code class="language-cli">invalid operands of types `Bruch*' and `Bruch*' to binary `operator*'
</code></pre>
<p>Hier ist mein Code:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
using namespace std;

class Bruch {
      public:
             Bruch(int zaehler = 1, int nenner = 1) : m_zaehler(zaehler), m_nenner(nenner) {}
             void Display() const {
                  cout &lt;&lt; m_zaehler &lt;&lt; &quot;/&quot; &lt;&lt; m_nenner &lt;&lt; endl;
             }
             int GetZaehler() const { return m_zaehler; }
             int GetNenner() const { return m_nenner; }
             Bruch* operator*(Bruch* otherBruch) {
                   int new_zaehler, new_nenner;
                   new_nenner = otherBruch-&gt;GetNenner() * this-&gt;GetNenner();
                   new_zaehler = otherBruch-&gt;GetZaehler() * this-&gt;GetZaehler();
                   Bruch* bruch = new Bruch(new_zaehler, new_nenner);
                   return bruch;
             }  
      private:
              int m_zaehler, m_nenner;
};

int main() {
    Bruch* bruch = new Bruch(3, 5);
    Bruch* bruch_2 = new Bruch(3, 5);
    Bruch* bruch_3 = bruch * bruch_2;

    int x;
    cin &gt;&gt; x;
    return 0;
}
</code></pre>
<p>Freue mich über jede Hilfe und bedankte mich schonmal im Voraus.</p>
<p>Achja, ist das was ich mache eigentlich effizient? Oder sollte man das ganze anderst lösen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815126</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815126</guid><dc:creator><![CDATA[OperatorOverloading]]></dc:creator><pubDate>Sun, 29 Nov 2009 19:44:00 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 19:52:01 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">int main() {
    Bruch* bruch = new Bruch(3, 5);
    Bruch* bruch_2 = new Bruch(3, 5);
    Bruch* bruch_3 = bruch * bruch_2;

    int x;
    cin &gt;&gt; x;
    return 0;
}
</code></pre>
<p>Weil</p>
<pre><code class="language-cpp">bruch * bruch_2
</code></pre>
<p>dem Funktionsaufruf</p>
<pre><code class="language-cpp">bruch.operator*(bruch_2)
</code></pre>
<p>entspricht, und bruch nunmal nur ein Bruch* ist (also ein Zeiger).<br />
In Operatoren solltest du eh const-Referenzen übergeben, und der return sollte auch ein Objekt sein (also weder Referenz noch Zeiger), damit später auch mal sowas möglich ist:</p>
<pre><code class="language-cpp">bruch4 = bruch1 * bruch2 * bruch3;
</code></pre>
<p>Das geht mit deiner jetzigen Lösung nie und nimmer....</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815134</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815134</guid><dc:creator><![CDATA[Knochenbrecher]]></dc:creator><pubDate>Sun, 29 Nov 2009 19:52:01 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 19:53:58 GMT]]></title><description><![CDATA[<p>So würde dein Code laufen:</p>
<pre><code class="language-cpp">Bruch* bruch_3 = bruch-&gt;operator*(bruch_2);

// oder offensichtilicher:

Bruch* bruch_3 = *bruch * bruch_2;
</code></pre>
<p>Unschön! Referenzen benutzen!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815135</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815135</guid><dc:creator><![CDATA[Ad aCTa]]></dc:creator><pubDate>Sun, 29 Nov 2009 19:53:58 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:03:49 GMT]]></title><description><![CDATA[<p>Hallo,</p>
<p>Dankeschön für die hilfreichen Antworten!</p>
<p>Eine Frage hätte ich aber noch, wenn ich nun meine Werte als Referenz übergebe, dann sieht das ja auch ziemlich unschön aus, denn dann müsste ich:</p>
<pre><code class="language-cli">Bruch bruch_3 = *bruch * *bruch_2;
</code></pre>
<p>machen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815142</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815142</guid><dc:creator><![CDATA[OperatorOverloading]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:03:49 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:08:06 GMT]]></title><description><![CDATA[<p>Dann nimm doch gleich keine Pointer...</p>
<pre><code class="language-cpp">int main() {
    Bruch bruch(3, 5);
    Bruch bruch_2(3, 5);
    Bruch bruch_3 = bruch * bruch_2;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1815145</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815145</guid><dc:creator><![CDATA[Knochenbrecher]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:08:06 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:10:21 GMT]]></title><description><![CDATA[<p>Mach's doch ohne Pointer:</p>
<pre><code class="language-cpp">const Bruch operator*(Bruch&amp; otherBruch) {
                   int new_zaehler, new_nenner;
                   new_nenner = otherBruch.GetNenner() * this-&gt;GetNenner();
                   new_zaehler = otherBruch.GetZaehler() * this-&gt;GetZaehler();
                   return Bruch(new_zaehler, new_nenner);
}
</code></pre>
<p>Normalerweise würde ich das aber als freie Funktion machen, da du dann implizite Typumwandlungen nutzen kannst.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815146</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815146</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:10:21 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:13:27 GMT]]></title><description><![CDATA[<pre><code class="language-cpp">const Bruch operator*(Bruch&amp; otherBruch) {
                   int new_zaehler, new_nenner;
                   new_nenner = otherBruch.GetNenner() * this-&gt;GetNenner();
                   new_zaehler = otherBruch.GetZaehler() * this-&gt;GetZaehler();
                   return Bruch(new_zaehler, new_nenner);
}
</code></pre>
<p>Ich würde kein const Bruch zurück geben, ist unnötig. Stattdessen ein const Bruch&amp; als Parameter, da ich im operator* hoffentlich (!) die Parameter nicht verändert werden. Non-const-Referenz verbaut dem Compiler auch Optimierungsmöglichkeiten.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815150</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815150</guid><dc:creator><![CDATA[Besenreiter]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:13:27 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:13:52 GMT]]></title><description><![CDATA[<p>Dankeschön!</p>
<p>Noch ne Frage, wenn ich das so mache, wie Du es vorgeschlagen hast, nämlich:</p>
<pre><code class="language-cpp">return Bruch(new_zaehler, new_nenner);
</code></pre>
<p>Wird dann das Objekt erst erstellt wenn ich wieder im main() bin? Oder wird es erstellt, zurückgeschickt und dann aus diesem scope gelöscht?</p>
<p>Denn ich würde noch Gerne die Memberfunktion Kuerzen() aufrufen, vor dem zurückschicken, aber falls das uneffizient ist, lässt sich auch den Nenner und Zaehler vor der Multiplikation kuerzen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815151</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815151</guid><dc:creator><![CDATA[OperatorOverloading]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:13:52 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:19:37 GMT]]></title><description><![CDATA[<p>Es wird erstellt, kopiert und anschließend gelöscht. Das kann der Compiler aber optimieren. Wenn du vorher kürzen willst, dann tu es doch:</p>
<pre><code class="language-cpp">Bruch newbruch(new_zaehler, new_nenner);
   newbruch.kuerzen();
   return newbruch;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1815152</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815152</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:19:37 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:21:46 GMT]]></title><description><![CDATA[<p>Danke für die Hilfe!</p>
<p>Noch eine letzte Frage habe ich.<br />
Weiter oben hast du angedeutet, dass man so etwas erstellen könnte:</p>
<p>bruch * bruch_1 * bruch_2 .. etc.</p>
<p>Ganz allgemein zum Operator Overloading, wie würde man das denn anstellen?</p>
<p>MfG</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815153</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815153</guid><dc:creator><![CDATA[OperatorOverloading]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:21:46 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:27:34 GMT]]></title><description><![CDATA[<p>So, wie es ist.<br />
bruch1 * bruch2 * bruch3 ist das gleiche wie<br />
(bruch1 * bruch2) * bruch3</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815157</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815157</guid><dc:creator><![CDATA[wx++]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:27:34 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:38:16 GMT]]></title><description><![CDATA[<p>OperatorOverloading schrieb:</p>
<blockquote>
<p>Danke für die Hilfe!</p>
<p>Noch eine letzte Frage habe ich.<br />
Weiter oben hast du angedeutet, dass man so etwas erstellen könnte:</p>
<p>bruch * bruch_1 * bruch_2 .. etc.</p>
<p>Ganz allgemein zum Operator Overloading, wie würde man das denn anstellen?</p>
</blockquote>
<p>Probiers doch aus...<br />
Mit folgendem Operator geht das von selbst:</p>
<pre><code class="language-cpp">Bruch operator*(const Bruch&amp; left, const Bruch&amp; right)
</code></pre>
<p>Ist jetzt als freie Funktion, das geht auch. Ist hier angebracht, da beide Operanden gleichberechtigt sind.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815161</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815161</guid><dc:creator><![CDATA[Knochenbrecher]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:38:16 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:40:22 GMT]]></title><description><![CDATA[<p>Du brauchst den Operator also nur einmal -- ganz normal -- zu überladen.</p>
<p>Du kannst dir das so vorstellen, dass bei</p>
<pre><code class="language-cpp">bruch1 * bruch2 * bruch3
</code></pre>
<p>zuerst</p>
<pre><code class="language-cpp">bruch1 * bruch2
</code></pre>
<p>ausgewertet wird und ein temporäres Objekt vom Typ <code>Bruch</code> erzeugt. Nennen wir es vorläufig <code>zwischenresultat</code> , um das Verständnis zu erleichtern. Der gesamte Ausdruck wird dann zu:</p>
<pre><code class="language-cpp">zwischenresultat * bruch3
</code></pre>
<p>So kann der <code>operator*</code> erneut auf die beiden Objekte angewandt werden, und man erhält das endgültige Resultat.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1815163</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815163</guid><dc:creator><![CDATA[Nexus]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:40:22 GMT</pubDate></item><item><title><![CDATA[Reply to Operator Overloading on Sun, 29 Nov 2009 20:48:01 GMT]]></title><description><![CDATA[<p>Aha, ich verstehe!</p>
<p>Danke vielmal <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>
]]></description><link>https://www.c-plusplus.net/forum/post/1815171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1815171</guid><dc:creator><![CDATA[OperatorOverloading]]></dc:creator><pubDate>Sun, 29 Nov 2009 20:48:01 GMT</pubDate></item></channel></rss>