DarkSpy
DarkSpy

Reputation: 15

Extra qualification and could not convert from ‘int’ to ‘Rational’

i want to this code class named Rational with the following methods:

a. Rational() // Default constructor returning rational number 1.

b. Rational(int n, int d) // Nominator is n, denominator is d.

c. int getNumerator() const

d. int getDenominator() const

e. Rational negate() const // Return -n/d

f. Rational reciprocal() const // Return d/n

g. bool operator==(const Rational& other) // Test equality of Rational numbers

h. Rational add(const Rational& rhs) const;

i. Rational subtract(const Rational& rhs) const;

j. Rational multiply(const Rational& rhs) const;

k. Rational divide(const Rational& rhs) const;


using namespace std;

class Rational
{
    private:
        int numerator;
        int denominator;

    public:
    Rational()
    {
        numerator = denominator = 1;
    }

    Rational(int n, int d)
    {
        numerator = n;
        denominator = d;
    }

    int getNumerator() const
    {
        return numerator;
    }   

    int getDenominator() const
    {
        return denominator;
    }

    Rational negate() const
    {
        return -numerator/denominator;
    }

    Rational reciprocal() const
    {
        return denominator/numerator;
    }

    bool operator==(const Rational& other)
    {
        if(numerator == other.numerator && denominator == other.denominator)
        {
            return true;
        }
        else
            return false;
    }

    Rational add(const Rational& a) const
    {
        Rational t; // creates Rational object
        t.numerator = a.numerator * denominator;
        t.numerator += a.denominator * numerator;
        t.denominator = a.denominator * denominator;
    return t;
    }

    Rational subtract(const Rational& b) const
    {
        Rational t; // creates Rational object
        t.numerator = b.denominator * numerator;
        t.numerator -= denominator * b.numerator;
        t.denominator = b.denominator * denominator;
    return t;
    }

    Rational multiply(const Rational& m) const
    {
        Rational t; // creates Rational object
        t.numerator = m.numerator * numerator;
        t.denominator = m.denominator * denominator;            
    return t;
    }

    Rational divide(const Rational& d) const
    {
        Rational t; // creates Rational object
        t.numerator = d.denominator * numerator;
        t.denominator = denominator * d.numerator;
    return t;
    }

    void Rational::printRational ()
    {
        if ( denominator == 0 ) // validates denominator
        cout << "\nDIVIDE BY ZERO ERROR!!!" << '\n';
        else if ( numerator == 0 ) // validates numerator
        cout << 0;
        else
        cout << numerator << '/' << denominator;
    } 

    void Rational::printRationalAsDouble()
    {
        cout << static_cast< double >( numerator ) / denominator;
    } 
};

int main() {
    Rational c( 2, 6 ), d( 7, 8 ), x; 
    c.printRational(); 
    cout << " + ";
    d.printRational();
    x = c.add( d ); 
    cout << " = ";
    x.printRational(); 
    cout << '\n';
    x.printRational(); 
    cout << " = ";
    x.printRationalAsDouble(); 
    cout << "\n\n";
    c.printRational(); 
    cout << " - ";
    d.printRational(); 
    x = c.subtract( d ); 

    cout << " = ";
    x.printRational(); 
    cout << '\n';
    x.printRational(); 
    cout << " = ";
    x.printRationalAsDouble(); 
    cout << "\n\n";
    c.printRational(); 
    cout << " x ";
    d.printRational(); 
    x = c.multiply( d );

    cout << " = ";
    x.printRational(); 
    cout << '\n';
    x.printRational(); 
    cout << " = ";
    x.printRationalAsDouble();  
    cout << "\n\n";
    c.printRational(); 
    cout << " / ";
    d.printRational(); 
    x = c.divide( d ); 

    cout << " = ";
    x.printRational(); 
    cout << '\n';
    x.printRational(); 
    cout << " = ";
    x.printRationalAsDouble();  
    cout << endl;
    return 0;
} 

but i take these error

main.cpp:87:10: error: extra qualification ‘Rational::’ on member ‘printRational’ [-fpermissive] void Rational::printRational () ^~~~~~~~

main.cpp:97:10: error: extra qualification ‘Rational::’ on member ‘printRationalAsDouble’ [-fpermissive] void Rational::printRationalAsDouble() ^~~~~~~~

main.cpp: In member function ‘Rational Rational::negate() const’: main.cpp:35:26: error: could not convert ‘((-(int)((const Rational*)this)->Rational::numerator) / ((int)((const Rational*)this)->Rational::denominator))’ from ‘int’ to ‘Rational’ return -numerator/denominator; ~~~~~~~~~~^~~~~~~~~~~~

main.cpp: In member function ‘Rational Rational::reciprocal() const’: main.cpp:40:27: error: could not convert ‘(((int)((const Rational*)this)->Rational::denominator) / ((int)((const Rational*)this)->Rational::numerator))’ from ‘int’ to ‘Rational’ return denominator/numerator; ~~~~~~~~~~~^~~~~~~~~~

Upvotes: 0

Views: 225

Answers (1)

ChrisMM
ChrisMM

Reputation: 10021

Change void Rational::printRational to void printRational Same this for printRationalAsDouble. When defining functions directly in the class, you don't specify the class name followed by ::

Also, in negate you have return -numerator/denominator; but this isn't valid, because it can't convert it to your return type of Rational. You probably want return Rational(-numerator, denominator);, and a similar for your reciprocal function. If you are trying to return the result of the operation, as opposed to a new object, then you can just change your return type.

Upvotes: 3

Related Questions