通过使用具有私有数据成员的类重载 + 运算符来添加分数

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

本文关键字:运算符 重载 添加 数据成员      更新时间:2023-10-16

首先,这是一个家庭作业。我只需要一些帮助 解决与分数运算符+() 函数相关的问题。它应该将函数 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 Fractionsn";
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。在那行之后,full只有分母,因为tempo的分子从未从0更改。

// 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的值。您可以延迟/防止整数溢出,您必须通过将两者除以它们的 GCD 来将numdenom减少到较小的值。

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 Fractionsn";
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;}}