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

时间:2014-10-23 10:21:15

标签: c++ pointers this overloading operator-keyword

我的部分任务是使用我教授的.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。例如,它应该是&#34; a.num = sign_factor * abs(num)还是我没有问题?

非常感谢!!

1 个答案:

答案 0 :(得分:0)

这个签名毫无意义:

&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
    }