2016-11-13 99 views
-2

我已经看过很多其他处理重载*运算符的帖子,但我仍然无法看到问题。重载乘法运算符

#include <iostream> 
#include <string> 
#include <cmath> 

using namespace std; 


class Fraction{ 
    private: 
     int num, den; 
    public: 
     void set(int n, int d); 
     void setNum(int newNum); 
     void setDen(int newDen); 
     Fraction add(Fraction other); 
     Fraction simplify(); 
     Fraction(int new_Num = 0, int new_Den = 0){ 
      num = new_Num; 
      den = new_Den; 
     }; 
     void output(Fraction& f); 
     void cleanerFunction(Fraction& f); 
     int gcd(); 
     Fraction reduce(); 
     friend ostream& operator <<(ostream& os, Fraction& f); 
     friend istream& operator >>(istream& in, Fraction& f); 
     friend Fraction operator + (const Fraction&, const Fraction&); 
     friend inline Fraction operator - (const Fraction&, const Fraction&); 
     friend Fraction operator * (const Fraction&, const Fraction&); 
     friend Fraction operator/(const Fraction&, const Fraction&); 
     friend bool operator < (const Fraction&, const Fraction&); 
     friend bool operator <= (const Fraction&, const Fraction&); 
     friend bool operator > (const Fraction&, const Fraction&); 
     friend bool operator >= (const Fraction&, const Fraction&); 
     friend bool operator == (const Fraction&, const Fraction&); 

}; 
int gcd(int x, int y); 
Fraction reduce(Fraction f); 
void reduce(Fraction& f); 

Fraction operator + (const Fraction& f, const Fraction& r){ 
    int temp_Num, temp_Den; 
    temp_Num = (f.num * r.den) + (f.den * r.num); 
    temp_Den = (f.den * r.den); 
    Fraction temp_Frac(temp_Num, temp_Den); 
    temp_Frac.cleanerFunction(temp_Frac); 
    return temp_Frac; 

}; 
Fraction operator - (const Fraction& f, const Fraction& r){ 
    int temp_Num, temp_Den; 
    temp_Num = (f.num * r.den) - (f.den * r.num); 
    temp_Den = (f.den * r.den); 
    Fraction temp_Frac(temp_Num, temp_Den); 
    temp_Frac.cleanerFunction(temp_Frac); 
    return temp_Frac; 

}; 
Fraction operator * (const Fraction& f, const Fraction& r){ 
    int temp_Num, temp_Den; 
    temp_Num = (f.num * r.num); 
    temp_Den = (f.den * r.den); 
    Fraction temp_Frac(temp_Num, temp_Den); 
    temp_Frac.cleanerFunction(temp_Frac); 
    return temp_Frac; 
}; 
Fraction operator/(const Fraction& f, const Fraction& r){ 
    int temp_Num, temp_Den; 
    temp_Num = (f.num * r.den); 
    temp_Den = (f.den * r.num); 
    Fraction temp_Frac(temp_Num, temp_Den); 
    return temp_Frac; 

}; 

bool operator < (const Fraction& f, const Fraction& r){ 
    return (f.num * r.den) < (r.num * f.den); 
}; 
bool operator <= (const Fraction& f, const Fraction& r){ 
    return (f.num * r.den) <= (r.num * f.den); 
}; 
bool operator > (const Fraction& f, const Fraction& r){ 
    return (f.num * r.den) > (r.num * f.den); 
}; 
bool operator >= (const Fraction& f, const Fraction& r){ 
    return (f.num * r.den) >= (r.num * f.den); 
}; 
bool operator == (const Fraction& f, const Fraction& r){ 
    return (f.num * r.den) == (r.num * f.den); 
}; 


ostream& operator <<(ostream& os, Fraction& f) 
{ 
    f.output(f); 
    return os; 
} 

istream& operator >>(istream& in, Fraction& f) 
{ 
    char ch; 
    int temp_Num, temp_Den; 
    in >> temp_Num >> ch >> temp_Den; 
    f.set(temp_Num, temp_Den); 
    f.cleanerFunction(f); 
    return in; 
} 

int main() 
{ 
    cout <<"HELLO\n"; 
    cout << "Testing declarations " << endl; 
    cout << "Fraction x, y(2), z(-5,-6), w(1,-3);" << endl; 
    Fraction x, y(2), z(-5,-6), w(1,-3); 
    cout << "z = " << z << ", y = " << y << ", z = " << z << ", w = " << w << endl; 
    cout << "Testing >> overloading: \nEnter a fraction in the format " << "integer _numerator/integer _denominator" << endl; 
    cin >> x; 
    cout << "You entered the equivalent of: " << x << endl; 
    //cout << z << " - (" << w << ") = " << z - w << endl; 
    cout << "Testing the constructor and normalization routines: " << endl; 
    y =Fraction(-128, -48); 
    cout << "y =Fraction(-128, -48) outputs as " << y << endl; 
    y =Fraction(-128, 48); 
    cout << "y =Fraction(-128, 48) outputs as " << y << endl; 
    y = Fraction(128,-48); 
    cout << "y = Fraction(128, -48) outputs as " << y << endl; 
    Fraction a(1,1); 
    cout << "Fraction a(1,1); a outputs as: " << a << endl; 
    Fraction ww = y*a; 
    cout << y << " * " << a << " = " << ww << endl; 
    w = Fraction(25,9); 
    z = Fraction(3,5); 
    cout << "Testing arithmetic and relational operator overloading" << endl; 
    //cout << w << " * " << z << " = " << w * z << endl; 
    //cout << w << " + " << z << " = " << w + z << endl; 
    //cout << w << " - " << z << " = " << w - z << endl; 
    //cout << w << "/" << z << " = " << w/z << endl; 
    cout << w << " < " << z << " = " << (w < z) << endl; 
    cout << w << " < " << w << " = " << (w < w) << endl; 
    cout << w << " <= " << z << " = " << (w <= z) << endl; 
    cout << w << " <= " << w << " = " << (w <= w) << endl; 
    cout << w << " > " << z << " = " << (w > z) << endl; 
    cout << w << " > " << w << " = " << (w > w) << endl; 
    cout << w << " >= " << z << " = " << (w >= z) << endl; 
    cout << w << " >= " << w << " = " << (w >= w) << endl; 
    w = Fraction(-21,9); 
    z = Fraction(3,5); 
    //cout << w << " * " << z << " = " << w * z << endl; 
    //cout << w << " + " << z << " = " << w + z << endl; 
    //cout << w << " - " << z << " = " << w - z << endl; 
    //cout << w << "/" << z << " = " << w/z << endl; 
    cout << w << " < " << z << " = " << (w < z) << endl; 
    cout << w << " < " << w << " = " << (w < w) << endl; 
    cout << w << " <= " << z << " = " << (w <= z) << endl; 
    cout << w << " <= " << w << " = " << (w <= w) << endl; 
    cout << w << " > " << z << " = " << (w > z) << endl; 
    cout << w << " > " << w << " = " << (w > w) << endl; 
    cout << w << " >= " << z << " = " << (w >= z) << endl; 
    cout << w << " >= " << w << " = " << (w >= w) << endl; 
    return 0; 
    return 0; 
} 

Fraction Fraction::add(Fraction other){ 
    Fraction result; 
    result.num = num*other.den + other.num *den; 
    result.den = den*other.den; 
    return result; 

} 


Fraction Fraction::simplify(){ 
    Fraction f1; 
    f1.num = 4; f1.den=5; 
    return f1; 

} 

int gcd(int x, int y){ 
    if(y<0) 
     y =-y; 

    if(x % y == 0) 
     return y; 
    else 
     return gcd(y, x%y); 
} 

int Fraction::gcd(){ 
    Fraction temp; 
    if(den<0) 
      den =-den; 

     if(num % den == 0) 
      return den; 
     else{ 
      temp.num =den; 
      temp.den= num%den; 
      return temp.gcd(); 
     } 
} 

void Fraction::set(int n, int d){ 
    num = n; 
    den = d; 

} 

void Fraction::setNum(int newNum){ 
    num = newNum; 
} 
void Fraction::setDen(int newDen){ 
    den = newDen; 
} 
Fraction Fraction::reduce(){ 
    Fraction temp; 
    temp.set(num,den); 
    int m = temp.gcd(); 
    num /= m; 
    den /= m; 
} 
Fraction reduce(Fraction f){ 
    int m = f.gcd(); 

} 
void reduce(Fraction& f){ 

} 

void Fraction::output(Fraction& f){ 

    f.cleanerFunction(f); 
    cout << num << "/"<< den; 
} 

void Fraction::cleanerFunction(Fraction& f){ 
    int temp_Num = num; 
    int temp_Den = den; 

    if ((temp_Num != 0) && (temp_Den == 0)) 
     temp_Den = 1; 
    if ((temp_Num > 0) && (temp_Den < 0)){ 
     temp_Den = abs(temp_Den); 
     temp_Num = -temp_Num; 
    }; 
    if ((temp_Num < 0) && (temp_Den < 0)){ 
     temp_Den = abs(temp_Den); 
     temp_Num = abs(temp_Num); 
    }; 

    num = temp_Num; 
    den = temp_Den; 
} 

有相关的代码,如果你需要更多,我可以发布。代码* cout < < w * z < < end1; *和Main()中的所有内容都不能修改,其他的都可以。

错误我得到的是 错误:无法绑定 '的std :: ostream的{又名性病:: basic_ostream}' 左值到 '的std :: basic_ostream & &'

在主注释掉线()是我得到错误消息的行。所以我遇到了(+, - ,*,/)操作符的问题。我只想看看*,所以我可以回去并对其余的应用相同的修复。

+2

是什么问题?你有错误信息吗?错误的结果? 'cleanerFunction'的定义在哪里? – user463035818

+0

我会添加更多信息。目前在清洁功能方面没有问题,因为它在程序的许多其他部分都有效,但是我会添加所有内容。 – Juscallmesteve

+0

_“,我仍然无法看到问题。”_我们也不能 - 你需要告诉我们问题是什么? –

回答

1

由于operator<<没有超载,因此需要将类Fraction作为参数,您会收到错误消息cout << w * z << endl;。尝试定义这个过载:

std::ostream& operator<<(std::ostream& os, const Fraction& f) 
{ 
    return os << f.den << "/" << f.num; 
} 

和下面的行添加到class Fraction定义为了使dennum可用此功能:

friend std::ostream& operator<<(std::ostream& os, const Fraction& f); 
+0

我已经超载了,我只是觉得在这篇文章中很重要。但我现在包括了整个程序。 – Juscallmesteve

+1

@Juscallmesteve你有重载,它采用'Fraction&'(即左值)。将其改为采用'const Fraction&'。 –

+0

好吧我从那里去 – Juscallmesteve