<?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überladung]]></title><description><![CDATA[<p>Hi, ich bin gerade dabei eine Klasse für rationale Zahlen zu schreiben, dabei sollen die 4 Grundrechenarten implementiert werden. Das wollte ich mit überladenen Operatoren machen. Bei operator+ mache ich allerdings was verkehrt. der Compiler schreibt mir:<br />
|59|error: 'Rn Rn::operator+(Rn, Rn)' must take either zero or one argument</p>
<pre><code class="language-cpp">/*
Entwerfen Sie einen ADT für rationale Zahlen. Implementieren Sie neben
einem sinnvollen Konstruktor sowie Setter- und Getter-Methoden folgende
Operationen:
- Rückgabe des Dezimalwerts einer rationalen Zahl
- weitestgehendes Kürzen der rationalen Zahl
- Implementieren der vier Grundrechenarten
Geben Sie dafür die Schnittstellen an und implementieren Sie den ADT!
*/

#include &lt;iostream&gt;
using namespace std;

class Rn{
    private:
        int numerator;       //Zähler
        int denominator;     //Nenner

        int gcd(int a, int b){  //greatest common divisor
            if (a &lt; 0) a *= -1;
            if (b &lt; 0) b *= -1;
            if (a == 0 || b == 0) return 1;
            if (a &lt; b) return gcd(a, b-a);
            if (a &gt; b) return gcd(a-b, b);
            else return a;
        }
        void reduce_rationalNumber() {
            int factor = gcd(numerator, denominator);
            numerator /= factor;
            denominator /= factor;
        }
    public:
        Rn() {
            numerator = 0;
            denominator = 1;
        }
        int get_numerator() { return numerator; }
        int get_denominator() { return denominator; }

        void set_rationalNumber() {
            cout &lt;&lt;&quot;\nNumerator: &quot;;
            cin &gt;&gt; numerator;

            int d;          //Kontrollvariable damit Division durch 0 verhindert wird
            do {
            cout &lt;&lt;&quot;Denominator: &quot;;
            cin &gt;&gt; d;
            if ( d == 0 ) cout &lt;&lt; &quot;Not defined, enter again.\n&quot;;
            } while (d == 0);
            denominator = d;
            reduce_rationalNumber();
        }
        void get_rationalNumber() {
            cout &lt;&lt;&quot;\n&quot; &lt;&lt; numerator &lt;&lt; &quot;/&quot; &lt;&lt; denominator;
        }
        void decimalValue() {
            cout &lt;&lt; &quot;\nDecimal: &quot; &lt;&lt; (numerator * 1.0) / (denominator * 1.0);
        }
        Rn operator+(const Rn a, const Rn b){   // a/b + c/d = (ad + bc) / bd
            Rn temp;
            temp.numerator = a.get_numerator() * b.get_denominator() + a.get_denominator * b.get_numerator();
            temp.denominator = a.get_denominator * b.get_denominator;
            return temp;
        }/*
        Rn operator-(Rn a, Rn b){

        }
        Rn operator*(Rn a, Rn b){

        }
        Rn operator/(Rn a, Rn b){

        }
*/

};

int main() {
    Rn a, b;
    Rn c;
    a.set_rationalNumber();
    a.get_rationalNumber();
    a.decimalValue();

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/290550/operatorüberladung</link><generator>RSS for Node</generator><lastBuildDate>Tue, 18 Aug 2026 09:20:58 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/290550.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 28 Jul 2011 19:26:34 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Operatorüberladung on Fri, 29 Jul 2011 16:00:58 GMT]]></title><description><![CDATA[<p>Hi, ich bin gerade dabei eine Klasse für rationale Zahlen zu schreiben, dabei sollen die 4 Grundrechenarten implementiert werden. Das wollte ich mit überladenen Operatoren machen. Bei operator+ mache ich allerdings was verkehrt. der Compiler schreibt mir:<br />
|59|error: 'Rn Rn::operator+(Rn, Rn)' must take either zero or one argument</p>
<pre><code class="language-cpp">/*
Entwerfen Sie einen ADT für rationale Zahlen. Implementieren Sie neben
einem sinnvollen Konstruktor sowie Setter- und Getter-Methoden folgende
Operationen:
- Rückgabe des Dezimalwerts einer rationalen Zahl
- weitestgehendes Kürzen der rationalen Zahl
- Implementieren der vier Grundrechenarten
Geben Sie dafür die Schnittstellen an und implementieren Sie den ADT!
*/

#include &lt;iostream&gt;
using namespace std;

class Rn{
    private:
        int numerator;       //Zähler
        int denominator;     //Nenner

        int gcd(int a, int b){  //greatest common divisor
            if (a &lt; 0) a *= -1;
            if (b &lt; 0) b *= -1;
            if (a == 0 || b == 0) return 1;
            if (a &lt; b) return gcd(a, b-a);
            if (a &gt; b) return gcd(a-b, b);
            else return a;
        }
        void reduce_rationalNumber() {
            int factor = gcd(numerator, denominator);
            numerator /= factor;
            denominator /= factor;
        }
    public:
        Rn() {
            numerator = 0;
            denominator = 1;
        }
        int get_numerator() { return numerator; }
        int get_denominator() { return denominator; }

        void set_rationalNumber() {
            cout &lt;&lt;&quot;\nNumerator: &quot;;
            cin &gt;&gt; numerator;

            int d;          //Kontrollvariable damit Division durch 0 verhindert wird
            do {
            cout &lt;&lt;&quot;Denominator: &quot;;
            cin &gt;&gt; d;
            if ( d == 0 ) cout &lt;&lt; &quot;Not defined, enter again.\n&quot;;
            } while (d == 0);
            denominator = d;
            reduce_rationalNumber();
        }
        void get_rationalNumber() {
            cout &lt;&lt;&quot;\n&quot; &lt;&lt; numerator &lt;&lt; &quot;/&quot; &lt;&lt; denominator;
        }
        void decimalValue() {
            cout &lt;&lt; &quot;\nDecimal: &quot; &lt;&lt; (numerator * 1.0) / (denominator * 1.0);
        }
        Rn operator+(const Rn a, const Rn b){   // a/b + c/d = (ad + bc) / bd
            Rn temp;
            temp.numerator = a.get_numerator() * b.get_denominator() + a.get_denominator * b.get_numerator();
            temp.denominator = a.get_denominator * b.get_denominator;
            return temp;
        }/*
        Rn operator-(Rn a, Rn b){

        }
        Rn operator*(Rn a, Rn b){

        }
        Rn operator/(Rn a, Rn b){

        }
*/

};

int main() {
    Rn a, b;
    Rn c;
    a.set_rationalNumber();
    a.get_rationalNumber();
    a.decimalValue();

    return 0;
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099170</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099170</guid><dc:creator><![CDATA[mad1Z]]></dc:creator><pubDate>Fri, 29 Jul 2011 16:00:58 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Thu, 28 Jul 2011 19:29:40 GMT]]></title><description><![CDATA[<p>Wenn du die Operatoren als Klassen-Methode überlädst, dann mußt du nur einen Parameter entgegennehmen - als linker Operand wird *this verwendet.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099171</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099171</guid><dc:creator><![CDATA[CStoll]]></dc:creator><pubDate>Thu, 28 Jul 2011 19:29:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Thu, 28 Jul 2011 19:30:10 GMT]]></title><description><![CDATA[<p>Wenn du operator+ innerhalb der Klasse deklarierst, ist der erste Parameter durch this bereits implizit vorgegeben. Du kannst also die Parameterzahl auf 1 reduzieren oder (besser) den operator+ als freie Funktion definieren.</p>
<p>BTW: Wenn du null Parameter hättest (was der Compiler dir zusätzlich vorschlägt), würdest du den unären operator+ überladen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099172</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099172</guid><dc:creator><![CDATA[Michael E.]]></dc:creator><pubDate>Thu, 28 Jul 2011 19:30:10 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Thu, 28 Jul 2011 19:31:40 GMT]]></title><description><![CDATA[<p>siehe zum Thema Operator-Überladung auch:<br />
<a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">Überladung von Operatoren in C++ (Teil 1)</a></p>
<p>Teil 2 und Teil 3 sind in diesem Beitrag auch verlinkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099173</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099173</guid><dc:creator><![CDATA[inter2k3]]></dc:creator><pubDate>Thu, 28 Jul 2011 19:31:40 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Thu, 28 Jul 2011 19:34:31 GMT]]></title><description><![CDATA[<p>Wo die eigentliche Frage jetzt beantwortet ist: Den Setter solltest Du auch nochmal überdenken. Erstens nimmt ein Setter normalerweise Parameter entgegen und liest nicht von cin. Zweitens ist so eine Rational-Klasse doch das Paradebeispiel für eine Wert- (und damit immutable-)Klasse, das heisst, eigentlich sollte es überhaupt keine Setter geben.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099176</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099176</guid><dc:creator><![CDATA[SG1]]></dc:creator><pubDate>Thu, 28 Jul 2011 19:34:31 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Fri, 29 Jul 2011 07:16:14 GMT]]></title><description><![CDATA[<p>inter2k3 schrieb:</p>
<blockquote>
<p>siehe zum Thema Operator-Überladung auch:<br />
<a href="http://magazin.c-plusplus.net/artikel/%DCberladung%20von%20Operatoren%20in%20CPlusPlus%20%28Teil%201%29" rel="nofollow">Überladung von Operatoren in C++ (Teil 1)</a></p>
<p>Teil 2 und Teil 3 sind in diesem Beitrag auch verlinkt.</p>
</blockquote>
<p>Teil 2 und 3 zeigen eine komplette Rational-Klasse mit allen Operatoren, die man sich dafür nur wünschen kann. Voraussetzung ist boost.Operators</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099288</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099288</guid><dc:creator><![CDATA[pumuckl]]></dc:creator><pubDate>Fri, 29 Jul 2011 07:16:14 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Fri, 29 Jul 2011 16:00:33 GMT]]></title><description><![CDATA[<p>Vielen Dank für die Hilfe. Mein Programm sieht jetzt folgendermaßen aus:</p>
<pre><code class="language-cli">#include &lt;iostream&gt;
using namespace std;

class Rn{
    private:
        int numerator;       //Zähler
        int denominator;     //Nenner

        int gcd(int a, int b){  //greatest common divisor
            if (a &lt; 0) a *= -1;
            if (b &lt; 0) b *= -1;
            if (a == 0 || b == 0) return 1;
            if (a &lt; b) return gcd(a, b-a);
            if (a &gt; b) return gcd(a-b, b);
            else return a;
        }
        void reduce_rationalNumber() {
            int factor = gcd(numerator, denominator);
            numerator /= factor;
            denominator /= factor;
        }
    public:
        Rn() { numerator = 0; denominator = 1; }
        Rn(int n, int d) {
            this-&gt;numerator = n;
            this-&gt;denominator = d;
        }
        int get_numerator() const { return numerator; }
        int get_denominator() const { return denominator; } 
        void set_numerator(int n) { this-&gt;numerator = n; }
        void set_denominator(int d) { this-&gt;denominator = d; }

        void get_rationalNumber() const {
            cout &lt;&lt;&quot;\n&quot; &lt;&lt; numerator &lt;&lt; &quot;/&quot; &lt;&lt; denominator;
        }
        void decimalValue() const {
            cout &lt;&lt; &quot;\nDecimal: &quot; &lt;&lt; (numerator * 1.0) / (denominator * 1.0);
        }
};

Rn operator+(Rn&amp; a, Rn&amp; b) {   // a/b + c/d = (ad + bc) / bd
    Rn temp;
    temp.set_numerator(a.get_numerator() * b.get_denominator() + a.get_denominator() * b.get_numerator());
    temp.set_denominator(a.get_denominator() * b.get_denominator());
    return temp;
}
Rn operator-(Rn&amp; a, Rn&amp; b) { // a/b - c/d = (ad - bc) / bd
    Rn temp;
    temp.set_numerator(a.get_numerator() * b.get_denominator() - a.get_denominator() * b.get_numerator());
    temp.set_denominator(a.get_denominator() * b.get_denominator());
    return temp;
}
Rn operator*(Rn&amp; a, Rn&amp; b) { // a/b * c/d = ac / bd
    Rn temp;
    temp.set_numerator(a.get_numerator() * b.get_numerator());
    temp.set_denominator(a.get_denominator() * b.get_denominator());
    return temp;
}
Rn operator/(Rn&amp; a, Rn&amp; b) { // a/b / c/d = ad / bc
    Rn temp;
    temp.set_numerator(a.get_numerator() * b.get_denominator());
    temp.set_denominator(a.get_denominator() * b.get_numerator());
    return temp;
}

int main() {
    Rn a(-1,2), b(1,2);
    Rn c = a+b;
    c.get_rationalNumber();
    c.decimalValue();

    return 0;
}
</code></pre>
<p>Bin mir nicht ganz sicher wo noch überall ein const fehlen könnte.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2099562</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099562</guid><dc:creator><![CDATA[mad1Z]]></dc:creator><pubDate>Fri, 29 Jul 2011 16:00:33 GMT</pubDate></item><item><title><![CDATA[Reply to Operatorüberladung on Fri, 29 Jul 2011 16:10:09 GMT]]></title><description><![CDATA[<pre><code class="language-cli">int gcd(int a, int b){  //greatest common divisor
            if (a &lt; 0) a *= -1;
            if (b &lt; 0) b *= -1;

//            if (a == 0 || b == 0) return 1;//falsch, oder?
            if (a == 0 ) return b;
//            if (b == 0 ) return a;//kommt eh nicht vor

            if (a &lt; b) return gcd(a, b-a);
            if (a &gt; b) return gcd(a-b, b);
            else return a;
        }
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2099570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2099570</guid><dc:creator><![CDATA[volkard]]></dc:creator><pubDate>Fri, 29 Jul 2011 16:10:09 GMT</pubDate></item></channel></rss>