重载运算符Rational错误

时间:2015-10-19 19:07:59

标签: operator-overloading

所以我环顾四周,因为对于大多数C ++学生来说,这似乎是一个常见的作业问题,但我似乎无法找到能够回答我的问题的问题。我觉得我已经正确填写了代码但每次都得到相同的错误。

这是我的代码:

#include <iostream>

using namespace std;

class Rational
{
public:
Rational() { 
    num = 0;
    denom = 1;
};
Rational(int n, int d) { 

    num = n;
    denom = d;
    normalize();
}
Rational(int n) { 
    num = n;
    denom = 1;
}
int get_numerator() const { 

    return num;

}
int get_denominator() const { 
    return denom;
}
void normalize() { 
    if ((num > 0 && denom < 0)||(num < 0 && denom < 0)) {
        num = -1 * num;
        denom = -1 * denom;
    }
    int gcdcheck = GCD(num,denom);
    num = num / gcdcheck;
    denom = denom / gcdcheck;

}
int Rational::GCD(int n, int d) {
    int temp;
    n = abs(n);
    d = abs(d);
    if (n > d) {
    // Do nothing everything is where it should be
    }
    else {
        temp = n;
        n = d;
        d = temp;
    }
    int factor = n % d;
    while (factor != 0) {
        factor = n % d;
        d = n;
        n = factor;

    }
    return d;//Return the value to normalize to simplify the fractions to      simplist form
}
Rational operator+(Rational b) const { 
    Rational add;
    //Addition of fractions (a*d/b*d + c*b/d*b)
    //Numerator = (a*d + c*b)
    add.get_numerator = b.get_numerator * denom + b.get_denominator * num;
    //Denomenator = (b*d)
    add.get_denominator = b.get_denominator * denom;
    add.normalize();
    return add;

}
Rational operator-(Rational b) const {
    Rational sub;
    //Same as Addition just a minus sign
    //Numerator = (a*d + c*b)
    sub.get_numerator = b.get_numerator * denom + b.get_denominator * num;
    //Denomenator = (b*d)
    sub.get_denominator = b.get_denominator * denom;
    sub.normalize();
    return sub;
}

Rational operator*(Rational b) const { 
//Multiply the numerators and denomenators
    Rational multi;


    multi.get_numerator = b.get_numerator * num;
    multi.get_denominator = b.get_denominator * denom;
    multi.normalize();

    return multi;
}
Rational operator/(Rational b) const { 
    //Division of fractions is done by the recipricol of one of the fractions
    Rational divi;
    divi.get_numerator = b.get_numerator * denom;
    divi.get_denominator = b.get_denominator * num;
    divi.normalize();
    return divi;
}

//To avoid issues with rounding the compare functions will multiply instead to give clean whole numbers
//This will be done by multiplying the denomenators by the opposite numerator
bool operator==(Rational b) const { 
    return ((b.get_numerator * denom == b.get_denominator * num));

}
bool operator<(Rational b) const { 
    return ((b.get_numerator * denom > b.get_denominator * num));
}
double toDecimal() const { 
    double result;
    result = static_cast<double> (num)/ static_cast<double> (denom);

    return result;

}
private:
int num = 0; // default value is 0
int denom = 1; // default value is 1
};
ostream& operator<<(std::ostream& output, Rational& a) {
if (a.get_denominator == 0) {
    output << "Divide by Zero";


}
output << a.get_numerator << '/' << a.get_denominator;
return output;

}

我知道它有很多代码,我不希望有人经历这一切所有的调试我只是觉得我会发布它以防万一问题跨越了我认为问题所在的地方。

我为每个操作员得到了相同的错误:

  

1:错误C3867:'Rational :: get_denominator':非标准语法;使用'&amp;'创建指向成员的指针

     

2:'*':错误C3867:'Rational :: get_denominator':非标准语法;使用'&amp;'创建指向成员的指针

     

3:错误C3867:'Rational :: get_numerator':非标准语法;使用'&amp;'创建指向成员的指针

我查看了来自不同在线网站的代码,这些代码已经解决了这个问题并尝试了他们的方法,但似乎没有用。我添加了const和&amp;到函数中的参数,我仍然得到相同的问题。我是否错误地调用了函数或初始化了一个错误?

2 个答案:

答案 0 :(得分:1)

您的代码中存在多个问题。这是更正后的代码。

  1. 您返回的值不是参考值。
  2. 当你在类中定义一个函数时,你不需要指定全名
  3. 缺少函数调用的()
  4. 最后对代码有一些评论。

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    class Rational
    {
    public:
        Rational()
        {
            num = 0;
            denom = 1;
        };
        Rational(int n, int d)
        {`
    
            num = n;
            denom = d;
            normalize();
        }
        Rational(int n)
        {
            num = n;
            denom = 1;
        }
        int& get_numerator() 
        {
    
            return num;
    
        }
        int& get_denominator() 
        {
            return denom;
        }
        void normalize()
        {
            if ((num > 0 && denom < 0) || (num < 0 && denom < 0))
            {
                num = -1 * num;
                denom = -1 * denom;
            }
            int gcdcheck = GCD(num, denom);
            num = num / gcdcheck;
            denom = denom / gcdcheck;
    
        }
        int GCD(int n, int d)
        {
            int temp;
            n = abs(n);
            d = abs(d);
            if (n > d)
            {
                // Do nothing everything is where it should be
            }
            else
            {
                temp = n;
                n = d;
                d = temp;
            }
            int factor = n % d;
            while (factor != 0)
            {
                factor = n % d;
                d = n;
                n = factor;
    
            }
            return d;//Return the value to normalize to simplify the fractions to      simplist form
        }
        Rational operator+(Rational b) const
        {
            Rational add;
            //Addition of fractions (a*d/b*d + c*b/d*b)
            //Numerator = (a*d + c*b)
            add.get_numerator()= b.get_numerator() * denom + b.get_denominator() * num;
            //Denomenator = (b*d)
            add.get_denominator() = b.get_denominator() * denom;
            add.normalize();
            return add;
    
        }
        Rational operator-(Rational b) const
        {
            Rational sub;
            //Same as Addition just a minus sign
            //Numerator = (a*d + c*b)
            sub.get_numerator() = b.get_numerator() * denom + b.get_denominator() * num;
            //Denomenator = (b*d)
            sub.get_denominator() = b.get_denominator() * denom;
            sub.normalize();
            return sub;
        }
    
        Rational operator*(Rational b) const
        {
    //Multiply the numerators and denomenators
            Rational multi;
    
    
            multi.get_numerator() = b.get_numerator() * num;
            multi.get_denominator() = b.get_denominator() * denom;
            multi.normalize();
    
            return multi;
        }
        Rational operator/(Rational b) const
        {
            //Division of fractions is done by the recipricol of one of the fractions
            Rational divi;
            divi.get_numerator() = b.get_numerator() * denom;
            divi.get_denominator() = b.get_denominator() * num;
            divi.normalize();
            return divi;
        }
    
    //To avoid issues with rounding the compare functions will multiply instead to give clean whole numbers
    //This will be done by multiplying the denomenators by the opposite numerator
        bool operator==(Rational b) const
        {
            return ((b.get_numerator() * denom == b.get_denominator() * num));
    
        }
        bool operator<(Rational b) const
        {
            return ((b.get_numerator() * denom > b.get_denominator() * num));
        }
        double toDecimal() const
        {
            double result;
            result = static_cast<double> (num) / static_cast<double> (denom);
    
            return result;
    
        }
    private:
        int num = 0; // default value is 0
        int denom = 1; // default value is 1
    };
    ostream& operator<<(std::ostream& output, Rational& a)
    {
        if (a.get_denominator() == 0)
        {
            output << "Divide by Zero";
    
    
        }
        output << a.get_numerator() << '/' << a.get_denominator();
        return output;
    
    }
    

    对代码的一些评论......返回引用,特别是对私有成员来说非常糟糕。我建议你创建一个set函数。

    所以基本上像以前一样保持get函数

    int get_denominator() const
    {
        return denom;
    }
    

    并创建一个新函数来设置值

    int set_denominator(int in) 
    {
        denom = in;
    }
    

答案 1 :(得分:0)

您尝试在没有画面的情况下调用该函数。它应该是get_denominator()

如果没有括号,则会获得指向函数的指针,并尝试对其执行arythmetic - 因此出错。