簡體   English   中英

通過使用帶有私有數據成員的類的+運算符重載來添加分數

[英]Adding fractions by overloading + operator using Class with Private Data Members

首先,這是一項家庭作業。 我只需要一些幫助來解決與小數運算符+()函數有關的問題。 應該在函數BinarayMathTest中將數組中的兩個分數相加在一起,但是Fraction :: operator +()函數僅返回分母。

#include <iostream>
#include <string>

using namespace std;



class Fraction
{
    private:
    int num,denom;
    public:

    Fraction operator + (const Fraction &right)const;

    friend ostream&operator<<(ostream&stream,Fraction obj);
    Fraction(int a=0,int b=1){num=a; denom=b;}

};

ostream&operator<<(ostream&stream,Fraction obj)
{
    stream<<obj.num<<'/';
   stream<<obj.denom;
   return stream;
}

Fraction Fraction::operator+(const Fraction &right)const
{
    Fraction temp;
    Fraction tempo;
    Fraction full;
    temp.num = ((num*right.denom) + (right.num*denom));
    tempo.denom =(denom*right.denom);
    full = (temp,tempo);
    return full;
}


void BinaryMathTest();


int main()
{

    BinaryMathTest();

    return 0;
}



void BinaryMathTest()
{
    cout << "\n----- Testing binary arithmetic between Fractions\n";

    const Fraction fr[] = {Fraction(1, 6), Fraction(1,3),
                       Fraction(-2,3), Fraction(5), Fraction(-4,3)};

    for (int i = 0; i < 4; i++) {
          cout << fr[i] << " + " << fr[i+1] << " = " << fr[i] + fr[i+1]
<<endl;}}



/* OUTPUT
----- Testing binary arithmetic between Fractions
1/6 + 1/3 = 0/18
1/3 + -2/3 = 0/9
-2/3 + 5/1 = 0/3
5/1 + -4/3 = 0/3
*/

Fraction :: operator +()函數僅返回分母。

讓我們跟隨該函數中的代碼行,看看會發生什么。

Fraction temp;  // Creates an object with num = 0, denom = 1
Fraction tempo; //    ditto
Fraction full;  //    ditoo

temp.num = ((num*right.denom) + (right.num*denom)); // Sets the num of temp

tempo.denom =(denom*right.denom);  // Sets the denom of tempo

我有一種感覺,你不知道下一行會發生什么。

full = (temp,tempo);

該行的RHS是使用逗號運算符的表達式。

它評估temp並丟棄該值。 它評估tempo並將其分配給full 在該行之后,因為tempo的分子從未從0改變,所以full僅具有分母。

// Returns an object whose numerator is zero.
return full;

您可以將該函數簡化為:

Fraction Fraction::operator+(const Fraction &right)const
{
   int num = ((num*right.denom) + (right.num*denom));
   int denom = (denom*right.denom);

   return Fraction(num, denom);
}

在上述實現中要注意的一件事是,如果繼續添加Fraction對象,它將迅速增加numdenom的值。 您可以延遲/防止整數溢出,必須將numdenom為較小的值,方法是將二者均除以GCD

Fraction Fraction::operator+(const Fraction &right)const
{
   int num = ((num*right.denom) + (right.num*denom));
   int denom = (denom*right.denom);
   int gcd = get_gcd(num, denom);

   return Fraction(num/gcd, denom/gcd);
}
#include <iostream>
#include <string>

using namespace std;

class Fraction
{
    private:
    int num,denom;
    float full;
    public:

    Fraction operator + (const Fraction &right)const;

    friend ostream&operator<<(ostream&stream,Fraction obj);
    Fraction(int a=0,int b=1){num=a; denom=b;}

};

ostream&operator<<(ostream&stream,Fraction obj)
{
    stream<<obj.num<<'/';
   stream<<obj.denom;
   return stream;
}

Fraction Fraction::operator+(const Fraction &right)const
{
    Fraction temp;

    temp.num = ((num*right.denom) + (right.num*denom));
    temp.denom =(denom*right.denom);
    Fraction full(temp.num,temp.denom); /*objet of class cannot give call to constructor by using = unless it is overloaded*/

    return full;
}


void BinaryMathTest();


int main()
{

    BinaryMathTest();

    return 0;
}



void BinaryMathTest()
{
    cout << "\n----- Testing binary arithmetic between Fractions\n";

    const Fraction fr[] = {Fraction(1, 6), Fraction(1,3),
                       Fraction(-2,3), Fraction(5), Fraction(-4,3)};

    for (int i = 0; i < 4; i++) {
          cout << fr[i] << " + " << fr[i+1] << " = " << fr[i] + fr[i+1]
<<endl;}}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM