<?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[Vorstellung Fraction Klasse]]></title><description><![CDATA[<p>Morgen,</p>
<p>ich würde euch gerne meine Fraction Klasse vorstellen(zumindest das was ich selbst geschafft habe). Ich bitte euch darum, um Konstruktive Kritik mit Erklärung zu dem was es zu kritisieren gibt und mir noch Verbesserungsvorschläge vorschlagt. Außerdem bitte ich um Erklärung von Erweiterungen wenn ihr welche machen würdet. Weiterhin wollte ich fragen was ich alles ändern müsste oder ob es überhaupt Sinn macht wenn ich das ganze als Template machen.</p>
<p>Fraction.h</p>
<pre><code class="language-cpp">#ifndef FRACTION_H_INCLUDED
#define FRACTION_H_INCLUDED
    class Fraction
    {
        private:
                int zaehler;
                int nenner;
        public:

        ///Konstruktor
        Fraction(int z,int n);
        Fraction() {}
        ///Überladene Operatoren
        Fraction operator+(const Fraction &amp;right)const;
        Fraction operator+(const float right)const;
        Fraction operator-(const Fraction &amp;right)const;
        Fraction operator-(const float right)const;
        Fraction operator*(const Fraction &amp;fraction)const;
        Fraction operator*(const float fraction)const;
        Fraction operator/(const Fraction &amp;right)const;
        Fraction operator/(const float right)const;
        ///Ende Überladene Operatoren
        friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, const Fraction &amp;f);
        friend std::istream &amp;operator&gt;&gt;(std::istream &amp;inside,Fraction &amp;f);
        ///Getter und Setter für &quot;zaehler&quot;
        int get_zaehler()const;
        void set_zaehler(int z);
        ///Getter und Setter für &quot;nenner&quot;
        int get_nenner()const;
        void set_nenner(int n);

        ///Methoden zum Bearbeiten des &quot;Bruches&quot;
        void kuerzen();
        int ggT(int a,int b);

};

#endif // FRACTION_H_INCLUDED
</code></pre>
<p>Fraction.cpp</p>
<pre><code class="language-cpp">#include &quot;includes.h&quot;

Fraction::Fraction(int z,int n)
{
    Fraction::zaehler = z;
    Fraction::nenner = n;

    Fraction::kuerzen();
}
////////////////////////////////////////
int Fraction::get_zaehler()const
{
    return Fraction::zaehler;
}
void Fraction::set_zaehler(int z)
{
    Fraction::zaehler = z;
}
////////////////////////////////////////
int Fraction::get_nenner()const
{
    return Fraction::nenner;
}
void Fraction::set_nenner(int n)
{
    Fraction::nenner = n;
}
////////////////////////////////////////
int Fraction::ggT(int a,int b)
{
    while(b != 0)
    {
        int temp = a%b;
        a = b;
        b = temp;
    }
    return a;
}

/////////////////////////////////////////
void Fraction::kuerzen()
{

    int ggt = ggT(zaehler,nenner);

    zaehler = zaehler / ggt;
    nenner = nenner / ggt;

}

/////////////////////////////////////////////
Fraction Fraction::operator+(const Fraction &amp;right)const
{
    Fraction result( zaehler * right.nenner + right.zaehler * nenner, nenner * right.nenner );

    result.kuerzen();
    return result;
}
/////////////////////////////////////////////
Fraction Fraction::operator+(const float right)const
{
    Fraction result( zaehler * right + right * nenner, nenner * right );

    result.kuerzen();
    return result;
}
///////////////////////////////////////////////
Fraction Fraction::operator-(const Fraction &amp;right)const
{
    Fraction result( zaehler * right.nenner - right.zaehler * nenner, nenner * right.nenner );

    result.kuerzen();
    return result;
}
///////////////////////////////////////////////
Fraction Fraction::operator-(const float right)const
{
    Fraction result( zaehler * right - right * nenner, nenner * right );

    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator*(const Fraction &amp;fraction) const
{
    Fraction result(zaehler*fraction.zaehler, nenner*fraction.nenner);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator*(const float fraction) const
{
    Fraction result(zaehler*fraction, nenner*fraction);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator/(const Fraction &amp;right) const
{
    Fraction result(zaehler*right.nenner, nenner*right.zaehler);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator/(const float right) const
{
    Fraction result(zaehler*right, nenner*right);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, const Fraction &amp;f)
{
    return ostr&lt;&lt;f.zaehler&lt;&lt;&quot;/&quot;&lt;&lt;f.nenner;
}
//////////////////////////////////////////////
std::istream &amp;operator&gt;&gt;(std::istream &amp;inside,Fraction &amp;f)
{
    std::string bruch;
    std::string str_nenner;
    std::string str_zaehler;
    std::stringstream string_to_int;
    int gefunden;
    int neuerzaehler;
    int neuernenner;

    inside&gt;&gt;bruch;
    ///Finden des Slashzeichen und Rückgabe desen Position
    gefunden = bruch.find(&quot;/&quot;);
    ///Aufspaltung in zaehler und nenner
    ///Teilstring von &quot;bruch&quot; bilden(zaehler). Von der Stelle 0 bis zur Stelle &quot;gefunden&quot;
    str_zaehler = bruch.substr(0,gefunden);
    ///Teilstring von Bruch bilden(nenner). Von der Stelle gefunden+1 bis zum Ende des Stringes
    str_nenner = bruch.substr(gefunden+1,bruch.length());

   ///Umwandlung von String in Int
   ///Umwandlung für den &quot;zaehler&quot;
   string_to_int&lt;&lt;str_zaehler;
   string_to_int&gt;&gt;f.zaehler;

   ///Umwandlung von String in Int
   ///Umwandlung für den &quot;nenner&quot;
   string_to_int.clear();
   string_to_int&lt;&lt;str_nenner;
   string_to_int&gt;&gt;f.nenner;

    return inside;
}
</code></pre>
<p>includes.h</p>
<pre><code class="language-cpp">#ifndef INCLUDES_H_INCLUDED
#define INCLUDES_H_INCLUDED

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &quot;Fraction.h&quot;

#endif // INCLUDES_H_INCLUDED
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;includes.h&quot;

using namespace std;

int main()
{

    Fraction fraction1;
    Fraction fraction2;

    cout&lt;&lt;&quot;Geben Sie Ihren 1. Bruch ein!(Inklusive des \&quot; / \&quot;)&quot;&lt;&lt;endl;
    cin&gt;&gt;fraction1;
    cout&lt;&lt;&quot;Geben Sie Ihren 2. Bruch ein!(Inklusive des \&quot; / \&quot;)&quot;&lt;&lt;endl;
    cin&gt;&gt;fraction2;

    cout&lt;&lt;&quot;Addition: &quot;&lt;&lt;fraction1+fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Multiplikation: &quot;&lt;&lt;fraction1*fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Subtraktion: &quot;&lt;&lt;fraction1-fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Division: &quot;&lt;&lt;fraction1/fraction2&lt;&lt;endl;

}
</code></pre>
<p>Ich hoffe es macht nicht zu viel Umstände.</p>
<p>Schönen Samstag noch.</p>
<p>EDIT:Achja ist mit Code::Blocks geschrieben wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/212214/vorstellung-fraction-klasse</link><generator>RSS for Node</generator><lastBuildDate>Wed, 14 Oct 2026 17:24:33 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/212214.rss" rel="self" type="application/rss+xml"/><pubDate>Sat, 03 May 2008 08:52:09 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:10:55 GMT]]></title><description><![CDATA[<p>Morgen,</p>
<p>ich würde euch gerne meine Fraction Klasse vorstellen(zumindest das was ich selbst geschafft habe). Ich bitte euch darum, um Konstruktive Kritik mit Erklärung zu dem was es zu kritisieren gibt und mir noch Verbesserungsvorschläge vorschlagt. Außerdem bitte ich um Erklärung von Erweiterungen wenn ihr welche machen würdet. Weiterhin wollte ich fragen was ich alles ändern müsste oder ob es überhaupt Sinn macht wenn ich das ganze als Template machen.</p>
<p>Fraction.h</p>
<pre><code class="language-cpp">#ifndef FRACTION_H_INCLUDED
#define FRACTION_H_INCLUDED
    class Fraction
    {
        private:
                int zaehler;
                int nenner;
        public:

        ///Konstruktor
        Fraction(int z,int n);
        Fraction() {}
        ///Überladene Operatoren
        Fraction operator+(const Fraction &amp;right)const;
        Fraction operator+(const float right)const;
        Fraction operator-(const Fraction &amp;right)const;
        Fraction operator-(const float right)const;
        Fraction operator*(const Fraction &amp;fraction)const;
        Fraction operator*(const float fraction)const;
        Fraction operator/(const Fraction &amp;right)const;
        Fraction operator/(const float right)const;
        ///Ende Überladene Operatoren
        friend std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, const Fraction &amp;f);
        friend std::istream &amp;operator&gt;&gt;(std::istream &amp;inside,Fraction &amp;f);
        ///Getter und Setter für &quot;zaehler&quot;
        int get_zaehler()const;
        void set_zaehler(int z);
        ///Getter und Setter für &quot;nenner&quot;
        int get_nenner()const;
        void set_nenner(int n);

        ///Methoden zum Bearbeiten des &quot;Bruches&quot;
        void kuerzen();
        int ggT(int a,int b);

};

#endif // FRACTION_H_INCLUDED
</code></pre>
<p>Fraction.cpp</p>
<pre><code class="language-cpp">#include &quot;includes.h&quot;

Fraction::Fraction(int z,int n)
{
    Fraction::zaehler = z;
    Fraction::nenner = n;

    Fraction::kuerzen();
}
////////////////////////////////////////
int Fraction::get_zaehler()const
{
    return Fraction::zaehler;
}
void Fraction::set_zaehler(int z)
{
    Fraction::zaehler = z;
}
////////////////////////////////////////
int Fraction::get_nenner()const
{
    return Fraction::nenner;
}
void Fraction::set_nenner(int n)
{
    Fraction::nenner = n;
}
////////////////////////////////////////
int Fraction::ggT(int a,int b)
{
    while(b != 0)
    {
        int temp = a%b;
        a = b;
        b = temp;
    }
    return a;
}

/////////////////////////////////////////
void Fraction::kuerzen()
{

    int ggt = ggT(zaehler,nenner);

    zaehler = zaehler / ggt;
    nenner = nenner / ggt;

}

/////////////////////////////////////////////
Fraction Fraction::operator+(const Fraction &amp;right)const
{
    Fraction result( zaehler * right.nenner + right.zaehler * nenner, nenner * right.nenner );

    result.kuerzen();
    return result;
}
/////////////////////////////////////////////
Fraction Fraction::operator+(const float right)const
{
    Fraction result( zaehler * right + right * nenner, nenner * right );

    result.kuerzen();
    return result;
}
///////////////////////////////////////////////
Fraction Fraction::operator-(const Fraction &amp;right)const
{
    Fraction result( zaehler * right.nenner - right.zaehler * nenner, nenner * right.nenner );

    result.kuerzen();
    return result;
}
///////////////////////////////////////////////
Fraction Fraction::operator-(const float right)const
{
    Fraction result( zaehler * right - right * nenner, nenner * right );

    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator*(const Fraction &amp;fraction) const
{
    Fraction result(zaehler*fraction.zaehler, nenner*fraction.nenner);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator*(const float fraction) const
{
    Fraction result(zaehler*fraction, nenner*fraction);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator/(const Fraction &amp;right) const
{
    Fraction result(zaehler*right.nenner, nenner*right.zaehler);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
Fraction Fraction::operator/(const float right) const
{
    Fraction result(zaehler*right, nenner*right);
    result.kuerzen();
    return result;
}
//////////////////////////////////////////////
std::ostream &amp;operator&lt;&lt;(std::ostream &amp;ostr, const Fraction &amp;f)
{
    return ostr&lt;&lt;f.zaehler&lt;&lt;&quot;/&quot;&lt;&lt;f.nenner;
}
//////////////////////////////////////////////
std::istream &amp;operator&gt;&gt;(std::istream &amp;inside,Fraction &amp;f)
{
    std::string bruch;
    std::string str_nenner;
    std::string str_zaehler;
    std::stringstream string_to_int;
    int gefunden;
    int neuerzaehler;
    int neuernenner;

    inside&gt;&gt;bruch;
    ///Finden des Slashzeichen und Rückgabe desen Position
    gefunden = bruch.find(&quot;/&quot;);
    ///Aufspaltung in zaehler und nenner
    ///Teilstring von &quot;bruch&quot; bilden(zaehler). Von der Stelle 0 bis zur Stelle &quot;gefunden&quot;
    str_zaehler = bruch.substr(0,gefunden);
    ///Teilstring von Bruch bilden(nenner). Von der Stelle gefunden+1 bis zum Ende des Stringes
    str_nenner = bruch.substr(gefunden+1,bruch.length());

   ///Umwandlung von String in Int
   ///Umwandlung für den &quot;zaehler&quot;
   string_to_int&lt;&lt;str_zaehler;
   string_to_int&gt;&gt;f.zaehler;

   ///Umwandlung von String in Int
   ///Umwandlung für den &quot;nenner&quot;
   string_to_int.clear();
   string_to_int&lt;&lt;str_nenner;
   string_to_int&gt;&gt;f.nenner;

    return inside;
}
</code></pre>
<p>includes.h</p>
<pre><code class="language-cpp">#ifndef INCLUDES_H_INCLUDED
#define INCLUDES_H_INCLUDED

#include &lt;iostream&gt;
#include &lt;string&gt;
#include &lt;sstream&gt;
#include &quot;Fraction.h&quot;

#endif // INCLUDES_H_INCLUDED
</code></pre>
<p>main.cpp</p>
<pre><code class="language-cpp">#include &quot;includes.h&quot;

using namespace std;

int main()
{

    Fraction fraction1;
    Fraction fraction2;

    cout&lt;&lt;&quot;Geben Sie Ihren 1. Bruch ein!(Inklusive des \&quot; / \&quot;)&quot;&lt;&lt;endl;
    cin&gt;&gt;fraction1;
    cout&lt;&lt;&quot;Geben Sie Ihren 2. Bruch ein!(Inklusive des \&quot; / \&quot;)&quot;&lt;&lt;endl;
    cin&gt;&gt;fraction2;

    cout&lt;&lt;&quot;Addition: &quot;&lt;&lt;fraction1+fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Multiplikation: &quot;&lt;&lt;fraction1*fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Subtraktion: &quot;&lt;&lt;fraction1-fraction2&lt;&lt;endl;
    cout&lt;&lt;&quot;Division: &quot;&lt;&lt;fraction1/fraction2&lt;&lt;endl;

}
</code></pre>
<p>Ich hoffe es macht nicht zu viel Umstände.</p>
<p>Schönen Samstag noch.</p>
<p>EDIT:Achja ist mit Code::Blocks geschrieben wurden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502455</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502455</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:10:55 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:06:59 GMT]]></title><description><![CDATA[<p>Hi!</p>
<p>Sieht auf den ersten Blick gut aus! Ich hätte aber noch ein paar kleine Verbesserungsvorschläge:<br />
- Mir fehlen operator== und !=, außerdem +=, -=, *=, /=<br />
- Die Methoden &quot;kuerzen&quot; und &quot;ggT&quot; würde ich private oder protected machen; gekürzt wird sowieso von alleine und die ggT-Methode gehört eher in eine Mathe-Bib (btw, ggT könnte auch static sein) <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="🙂"
    /><br />
- Eventuell die Stream-Operatoren auslagern? Brauchen dank get_nenner und get_zaehler auch nicht friend zu sein.</p>
<p>edit:</p>
<p>FireFighter schrieb:</p>
<blockquote>
<p>Ich hoffe es macht zu viel Umstände.</p>
</blockquote>
<p>Das hoffe ich auch <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>Achso, und wegen der Template-Sache: Wäre evtl nicht schlecht, vor allem da man u.U. doch mal größere Zähler und Nenner braucht als 2 Mrd <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="🙂"
    /> Obwohl das manches vielleicht auch schwieriger macht, denn du bräuchtest dann evtl auch eine Konvertierung von Fraction&lt;int&gt; nach Fraction&lt;unsigned long&gt; oder so..</p>
<p>Oh, und evtl eine Methode &quot;double asDouble() const&quot; oder so? Falls man den Wert dann doch als Fließkomma-Zahl braucht, wäre das wahrscheinlich nicht schlecht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502458</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502458</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 03 May 2008 09:06:59 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:06:25 GMT]]></title><description><![CDATA[<p>Hmm, wieso sind denn die Operatoren für den Float-Typen überladen? Wäre int das nicht sinnvoller?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502460</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502460</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 09:06:25 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:06:46 GMT]]></title><description><![CDATA[<p>warum diese deutsch englich mischung?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502461</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502461</guid><dc:creator><![CDATA[stammleser]]></dc:creator><pubDate>Sat, 03 May 2008 09:06:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:08:38 GMT]]></title><description><![CDATA[<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/13210">@Badestrand</a><br />
Klasse danke für Deine Meinung, ich werde mich gleich ransetzen und das mit einfügen.<br />
@stammleser<br />
--.-- da hast du natürlich recht. Werde ich auch sofort um umändern, danke für dein Beitrag.<br />
<a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/4465">@Tachyon</a><br />
Logisch, was ich da wohl gedacht hatte <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/1502462</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502462</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:08:38 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:09:52 GMT]]></title><description><![CDATA[<p>Bei den ganzen Operatoren muss du ne Referenz zurückgeben</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502463</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502463</guid><dc:creator><![CDATA[ref]]></dc:creator><pubDate>Sat, 03 May 2008 09:09:52 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:11:36 GMT]]></title><description><![CDATA[<p>Ach die Operatoren sind ja völlig im Arsch</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502464</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502464</guid><dc:creator><![CDATA[ref]]></dc:creator><pubDate>Sat, 03 May 2008 09:11:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:12:41 GMT]]></title><description><![CDATA[<p>klasse danke für dein Edit Badestrand, ich werde es mir zu Herzen nehmen.</p>
<p>P.S. Ich habe den Fehler geändert <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/1502465</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502465</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:12:41 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:13:15 GMT]]></title><description><![CDATA[<p>ref schrieb:</p>
<blockquote>
<p>Bei den ganzen Operatoren muss du ne Referenz zurückgeben</p>
</blockquote>
<p>Wie kommst Du denn darauf? Das wäre tötlich.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502466</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502466</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 09:13:15 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:14:19 GMT]]></title><description><![CDATA[<p>Er hat das mit den Operatoren eh völlig falsch gemacht. Die verändern das Objekt ja gar nicht! Normalerweise gibt man *this zurück als Referenz.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502468</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502468</guid><dc:creator><![CDATA[ref]]></dc:creator><pubDate>Sat, 03 May 2008 09:14:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:15:19 GMT]]></title><description><![CDATA[<p>soll ja auch so sein, ich will ja nicht das meine Stammobjekte die am anfang eingegeben werden geändert werden sollen <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="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502471</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502471</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:15:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:18:27 GMT]]></title><description><![CDATA[<p>rofl</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502472</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502472</guid><dc:creator><![CDATA[ref]]></dc:creator><pubDate>Sat, 03 May 2008 09:18:27 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:20:11 GMT]]></title><description><![CDATA[<p>ref schrieb:</p>
<blockquote>
<p>Er hat das mit den Operatoren eh völlig falsch gemacht. Die verändern das Objekt ja gar nicht! Normalerweise gibt man *this zurück als Referenz.</p>
</blockquote>
<p>Ist alles gut.</p>
<pre><code class="language-cpp">Fraction a(1,2);
Fraction b(1,3);
Fraction c = a + b;
</code></pre>
<p>Sollte danach a etwa auch 5/6 sein? Ich denke nicht.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502473</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502473</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 09:20:11 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:22:10 GMT]]></title><description><![CDATA[<p>hast recht</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502481</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502481</guid><dc:creator><![CDATA[ref]]></dc:creator><pubDate>Sat, 03 May 2008 09:22:10 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:22:17 GMT]]></title><description><![CDATA[<p>richtig genau das is der Punkt Tachyon. Genau wegen so einem Problem habe ich hier nämlich shconmal im Forum angefragt <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/1502482</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502482</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:22:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:29:31 GMT]]></title><description><![CDATA[<p>Die Rückgabe einer Referenz kommt natürlich bei den bereits vorhandenen Operatoren nicht in Frage. Es fehlen auch noch ein paar, einige wurden schon genannt, ich führe nochmal auf<br />
unär: + -<br />
binär: == != &lt; &gt; &lt;= &gt;= += -= *= /=<br />
Eine einfache Konvertierung aus int wäre wünschenswert, es ist relativ natürlich zu schreiben:</p>
<pre><code class="language-cpp">Fraction x = 1;
</code></pre>
<p>Sinnvoll würde man hier wohl mit Defaultargumenten arbeiten - insofern halte ich den jetzigen Defaultkonstruktor nicht für günstig, weil er keine Initialisierung durchführt (das kann nat. auch Absicht sein). Für günstiger halte ich</p>
<pre><code class="language-cpp">Fraction(int zaehler=0,int nenner=1);
</code></pre>
<p>aber man kann das diskutieren.<br />
ggT hat nichts mit einer konkreten Instanz von Fraction zu tun, und sollte folglich wenigstens static sein - tatsächlich hat es nicht mal entfernt etwas mit Fraction zu tun - eine freie Funktion ist hier weitaus sinnvoller. Das Problem mit der Interaktion mit float wurde schon angesprochen - das kann man machen, aber da float nicht exakt ist, kann das Ergebnis auch nicht exakt sein, und sollte folglich float sein (analog double, long double). Schließlich erlauben diese Operatoren float-Argumente nur für den rechten Operanden, das ist unintuitiv - die Benutzung von freien Operatoren ist hier absolut angebracht.</p>
<p>Ob die Streamoperatoren dagegen in der Klasse (+friend) definiert werden, oder erst außerhalb (und möglicherweise nicht friend) ist dagegen absolut und völlig egal. Für den Benutzer spielt es keine Rolle, und auch an der Implementation ändert sich nichts und eine 3. interessierte Partei existiert nicht. Der Kommentar darüber ist allerdings falsch! Was sollen die denn sonst sein, wenn nicht überladene Operatoren?!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502484</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502484</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 May 2008 09:29:31 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:28:00 GMT]]></title><description><![CDATA[<p>Ui, den unären Operator '+' kannte ich gar nicht - sollte der einfach &quot;leer&quot; implementiert werden?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502486</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502486</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 03 May 2008 09:28:00 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:29:17 GMT]]></title><description><![CDATA[<p>ok super danke camper, ich werde deine Hinweise beherzigen und es versuchen soweit umzuschreiben. Ist es denn auch ok wenn ich soviele MEthoden nur für die Operatoren machen? Also ist das bei solchen Klassen normal?</p>
<p>EDIT: Genau was meinst du mit den unären + -</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502487</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502487</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:29:17 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:34:39 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>EDIT: Genau was meinst du mit den unären + -</p>
</blockquote>
<p>Für positive und negative Zahlen.</p>
<pre><code class="language-cpp">Fraction a(1,2);
Fraction b = -a;
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1502491</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502491</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 09:34:39 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:35:37 GMT]]></title><description><![CDATA[<p>ach du scheiße, daran habe ich ja gar nicht gedacht, stimmt sowas müsste ich noch einfügen. Mal eine Frage wie müsste ich denn += Operator für 2 FRaction objekte bauen?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502492</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502492</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 09:35:37 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 09:41:05 GMT]]></title><description><![CDATA[<p>Badestrand schrieb:</p>
<blockquote>
<p>Ui, den unären Operator '+' kannte ich gar nicht - sollte der einfach &quot;leer&quot; implementiert werden?</p>
</blockquote>
<p>Er sollte den Wert der Zahl zurückgeben (also keine Referenz, wie man versucht sein könnte). Natürlich <em>macht</em> er nichts interessantes.</p>
<p>Unäre Operatoren sind solche, die nur einen Operanden haben. Wir möchten z.B. Schreiben:</p>
<pre><code class="language-cpp">Fraction x = ...
x = -x; // unäres Minus
x = +x; // unäres Plus - macht im Prinzip gar nichts, existiert der Systematik wegen
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1502495</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502495</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 May 2008 09:41:05 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 18:18:36 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>Mal eine Frage wie müsste ich denn += Operator für 2 FRaction objekte bauen?</p>
</blockquote>
<p>So evtl.:</p>
<pre><code class="language-cpp">Fraction&amp; operator+=(const Fraction&amp; right)
{
    m_numerator = m_numerator * right.m_denominator + right.m_numerator * m_denominator;
    m_denominator = m_denominator * right.m_denominator;
    return *this;
}
</code></pre>
<p>Edit: Das const vor der zurückgegebenen Referenz war mist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502502</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502502</guid><dc:creator><![CDATA[Tachyon]]></dc:creator><pubDate>Sat, 03 May 2008 18:18:36 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 10:00:46 GMT]]></title><description><![CDATA[<p>Mit Templates würde ich noch nicht anfangen - die aufgezeigten Probleme indizieren, dass hier wahrscheinlich noch Lernbedarf besteht. Während man damit einige Probleme elegant lösen kann, ergeben sich auch einige Schwierigkeiten, bei denen man ein gutes Verständnis der &quot;einfachen&quot; Klasse voraussetzen müsste.</p>
<p>Die Problematik interner Überläufe muss man allerdings in jedem Falle betrachten, solange die Typen für Zähler und Nenner nicht beliebig große Zahlen erfassen können. Dabei gibt es wahrscheinlich keine richtig gute Lösung.<br />
Schlecht dürfte sein, diese Fälle als Fehler aufzufassen und etwa mit Exceptions zu reagieren. Man kann im Voraus kürzen (dann sollte die Klasse besser rational heißen) aber das ist keine sichere Lösung. Letztlich bleibt dann nur die Möglichkeit, einen genäherten Wert darzustellen - in diesem Moment ist die Klasse dann aber nicht mehr exakt, und die Argumentation hinsichtlich der Interaktion mit float&amp;Co. kehrt sich um. Es kommen auch mehrere Möglichkeiten der Näherung in Frage, boost:rational etwa benutzt den größten darstellbaren Nenner und wählt den Zähler entsprechend. Eine andere Möglichkeit könnte im &quot;übermäßigen&quot; Kürzen bestehen (also Kürzen mit einer Zahl die nicht Teiler von sowohl Zähler als auch Nenner ist). Am Besten - in meinen Augen - dürfte noch sein, die dem exakten Ergebnis nächste darstellbare Zahl zu wählen: das läuft auf eine Kettenbruchentwicklung hinaus (oder vielleicht geht es auch eleganter, meine Mathekenntnisse sind ein bisschen eingerostet), ist also etwas komplexer aber nicht sehr kompliziert.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502503</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502503</guid><dc:creator><![CDATA[camper]]></dc:creator><pubDate>Sat, 03 May 2008 10:00:46 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 12:39:19 GMT]]></title><description><![CDATA[<p>Firefighter schrieb:</p>
<blockquote>
<p>Weiterhin wollte ich fragen was ich alles ändern müsste oder ob es überhaupt Sinn macht wenn ich das ganze als Template machen.</p>
</blockquote>
<p>Macht absolut Sinn. Allerdings sollte für diesen Schritt die jetzige Klasse erstmal einwandfrei funktionieren.</p>
<p>Badestrand schrieb:</p>
<blockquote>
<p>Ui, den unären Operator '+' kannte ich gar nicht - sollte der einfach &quot;leer&quot; implementiert werden?</p>
</blockquote>
<p>Nein, schliesslich muss der ja etwas zurückgeben. Eine Möglichkeit wäre folgende:</p>
<pre><code class="language-cpp">Fraction operator +() const
	{
		return Fraction(+zaehler, nenner);
	}
</code></pre>
<p><a class="plugin-mentions-user plugin-mentions-a" href="https://www.c-plusplus.net/forum/uid/15364">@Firefighter</a><br />
Noch ein Tipp, binäre Non-Assignment Operatoren solltest du ausserhalb der Klasse, im Namensraum definieren. Notfalls in der Klasse als friend deklarieren, falls du auf non-public Member zugreifen möchtest. Nur mal ein Beispiel, was gegen Member-Funktionen spricht:</p>
<pre><code class="language-cpp">Fraction(1, 3) * 1.5
1.5 * Fraction(1, 3)
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1502570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502570</guid><dc:creator><![CDATA[groovemaster]]></dc:creator><pubDate>Sat, 03 May 2008 12:39:19 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 14:15:04 GMT]]></title><description><![CDATA[<p>Ok danke an alle für eure Meinung, besonderen Dank an camper für seine Professionelle Einschätzung und Meinung <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="🙂"
    /> Werde mich wahrscheinlich bei Fragen noch öfters melden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502634</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502634</guid><dc:creator><![CDATA[Firefighter]]></dc:creator><pubDate>Sat, 03 May 2008 14:15:04 GMT</pubDate></item><item><title><![CDATA[Reply to Vorstellung Fraction Klasse on Sat, 03 May 2008 14:37:57 GMT]]></title><description><![CDATA[<p>groovemaster schrieb:</p>
<blockquote>
<p>Noch ein Tipp, binäre Non-Assignment Operatoren solltest du ausserhalb der Klasse, im Namensraum definieren. Notfalls in der Klasse als friend deklarieren, falls du auf non-public Member zugreifen möchtest.</p>
</blockquote>
<p>Oder einfach über die Assignment-Operatoren:</p>
<pre><code class="language-cpp">Fraction operator+( const Fraction&amp; frac, const float val )
{
    Fraction ret( frac );
    ret += val;
    return ret;
}
</code></pre>
<p>So bleibt die Logik in der Klasse; und Redundanz und so.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1502643</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1502643</guid><dc:creator><![CDATA[Badestrand]]></dc:creator><pubDate>Sat, 03 May 2008 14:37:57 GMT</pubDate></item></channel></rss>