我的班级意外添加运算符

时间:2017-04-20 16:41:51

标签: c++ c++11 operator-overloading

如果问题是天真,我道歉。

我正在尝试重叠分数的加法运算符。我的意图是添加分数但由于某种原因它添加了整数。有人可以解释为什么它会执行整数加法。代码如下。

#include <iostream>
#include <string>

using namespace std;



class Fraction{
  long numerator;
  long denominator;
  long gcd(long num1, long num2);
  long lcm(long num1, long num2);
public:
  void convert_int_to_fraction(int num); 
  void reduce();
  Fraction(int num);
  Fraction(){
    numerator = 0;
    denominator = 0;
  }
  Fraction(long num, long den);
  Fraction operator+(Fraction fraction);
  friend ostream& operator<<(ostream& os, const Fraction& fracNumber);

};

void Fraction::convert_int_to_fraction(int num){
    denominator = 1;
    numerator = long(num);
    reduce();
}

Fraction::Fraction(int num){
    convert_int_to_fraction(num);
}

long Fraction::gcd(long num1, long num2){
    if(num1 == 0)
        return num2;
    else
        return (gcd(num2 % num1, num1));
}

//Math function to calculate LCM
long Fraction::lcm(long num1,  long num2){
    long great_Divisor = gcd(num1, num2);
    return ((num1/great_Divisor) * num2);
}

//Reduce fraction to its minimal
void Fraction::reduce(){
    if(denominator!=0){
        long great_Divisor = gcd(numerator, denominator);
        numerator /= great_Divisor;
        denominator /= great_Divisor;
        if(denominator < 0 && numerator > 0){
            denominator = -denominator;
            numerator = -numerator;
        }
    }
}

Fraction::Fraction(long num, long den):numerator(num), denominator(den){
    reduce();
}

ostream& operator<<(ostream& os, const Fraction& fracNumber){
    os << fracNumber.numerator << "/" << fracNumber.denominator ;
    return os;
}

Fraction Fraction::operator+(Fraction fraction){
    Fraction result;
    long least_Multiple = lcm(denominator, fraction.denominator);
    result.denominator = (least_Multiple);
    long result_Numerator = ((numerator * (least_Multiple/denominator)) + 
                                (fraction.numerator * (least_Multiple/fraction.denominator)));
    result.numerator = (result_Numerator);
    result.reduce();
    return result;
}

int main(){
  Fraction frac1(2,4);
  cout << frac1 + 2  << endl;
  return 0;
}

输出是5/2所以我试着反过来做

  cout << 2 + frac1   << endl;

这给了我错误。所以现在我试图通过实现这两个函数来解决这个问题。

Fraction::operator int(){
    return convert_fraction_to_int();
}
int Fraction::convert_fraction_to_int(){
    return ((int)(numerator/denominator));
}

现在即使是第一个操作cout也无法正常工作。但最好的是当我对变量进行类型转换时一切正常。任何人都可以解释为什么它在第一种情况下工作,为什么不在第二种情况下以及为什么在第三种情况下破坏。

1 个答案:

答案 0 :(得分:2)

  

。我的意图是添加分数但由于某种原因它添加了整数。有人可以解释为什么它会执行整数加法。

有一个转换构造函数从intFraction

编译器将

frac1 + 2转换为frac1 + Fraction(2)

<强>更新

如果您希望编译器能够同时支持frac1 + 22 + frac1,则可以使operator+函数成为非成员函数。

friend Fraction operator+(Fraction const& lhs, Fraction const& rhs);

并将其实施为:

Fraction operator+(Fraction const& lhs, Fraction const& rhs)
{
   Fraction result;

   // Needed to make lcm and gcd static member functions since
   // they work independent of the member variables.

   long least_Multiple = Fraction::lcm(lhs.denominator, rhs.denominator);
   result.denominator = (least_Multiple);
   long result_Numerator = ((lhs.numerator * (least_Multiple/lhs.denominator)) + 
                            (rhs.numerator * (least_Multiple/rhs.denominator)));
   result.numerator = (result_Numerator);
   result.reduce();
   return result;
}

现在,您可以使用

Fraction frac1(2,4);
Fraction frac2(3,7);
cout << frac1 + 2  << endl;
cout << 3 + frac1  << endl;
cout << frac1 + frac2 << endl;