重载乘法运算符

Overloading the Multiplication Operator

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

我已经看了许多其他处理*操作符重载的帖子,我仍然无法看到这个问题。

    #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 <<"HELLOn";
     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 <<endl;*和Main()中的所有内容都不能修改,其他所有内容都可以。

Error I get is错误:无法将'std::ostream{也称为std::basic_ostream}'左值绑定到'std::basic_ostream&&'

Main()中注释掉的行是我得到错误消息的行。所以我遇到了(+,-,*,/)运算符的问题。我只是想看看*,这样我就可以回去对其余的应用相同的修复

您在cout << w * z << endl;得到错误消息,因为没有将Fraction类作为参数的operator<<过载。尝试定义这个重载:

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);