关于分数计算器的运算符重载

Regarding Operator Overloading for a Fraction Calculator

本文关键字:运算符 重载 计算器      更新时间:2023-10-16

我的部分任务是使用教授的.cpp文件。在它中,我应该能够处理A=A+B,其中A和B是两个分数。

&Fraction Fraction::operator+(Fraction b)
{
  num = (num * b.denom) + (num * denom);/////// 
  denom = (denom * b.denom);
  if ((num * denom) >= 0) 
{ 
  sign_factor = 1;
}
else
{
  sign_factor = -1;
}
num = sign_factor * abs(num);
denom = sign_factor * abs(denom);
num = (num / (static_cast<double>(find_gcd(num, denom))));
denom = (denom / (static_cast<double>(find_gcd(num, denom))));
return this;
}

我的问题是如何返回对象A,以便main.cpp可以执行成员分配(将A+B的结果分配给A)。此外,我在这个函数中引用num是正确的吗,还是应该使用a.num。例如,它应该是"a.num=sign_factor*abs(num)",还是我所拥有的可以?

非常感谢!!

这个签名毫无意义:

&Fraction Fraction::operator+(Fraction b)

我不知道你的代码的用途,但在a = a + b中,用结果创建一个临时的并返回可能是有意义的

class Fraction {
public:
    Fraction operator+(Fraction b) const // Return a Fraction object
    {
        Fraction result;
        // ... initialize result...
        return result;
    }
};

如果num被定义为Fraction类(或其子类之一)的成员变量,则可以像以前一样安全地使用它或将其用作this->num


编辑:

关于您的评论,我添加了一些代码来解释为什么返回临时对象可能更有意义。比较这两个版本,决定哪一个更适合你的需求。直觉上,第一个是首选,也是最合乎逻辑的选择。

  • 版本1:返回临时(a未被修改)

    class Fraction {
    public:
        Fraction operator+(Fraction& b)
        {
            Fraction result;
            result.num = num + b.num;
            return result;
        }
        void operator=(Fraction& b)
        {
            num = b.num;
        }
        int num;
    };
    
    int main()
    {
        Fraction a, b, c;
        a.num = 10;
        b.num = 20;
        c.num = 0;
        c = a + b;
        // a is now 10
        // b is now 20
        // c is now 30
    }
    
  • 版本2:返回引用并修改a

    class Fraction {
    public:
        Fraction& operator+(Fraction& b)
        {
            num = num + b.num;
            return *this;
        }
        void operator=(Fraction& b)
        {
            num = b.num;
        }
        int num;
    };
    
    int main()
    {
        Fraction a, b, c;
        a.num = 10;
        b.num = 20;
        c.num = 0;
        c = a + b;
        // a is now 30 <- I believe you don't want this
        // b is now 20
        // c is now 30
    }