Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

New to c++ and Overloading operators, unsure how to use the function

Hi I am rather new to C++, I have just started learning it after learning some Java basics. I have pre-existing code were it has overloaded the >> operator, however after watching many tutorials and trying to understand the issue, I thought I would ask here.

Rational cpp file:

 #include "Rational.h"

#include <iostream>




Rational::Rational (){

}



Rational::Rational (int n, int d) {
    n_ = n;
    d_ = d;
}

/**
 * Creates a rational number equivalent to other
 */
Rational::Rational (const Rational& other) {
    n_ = other.n_;
    d_ = other.d_;
}

/**
 * Makes this equivalent to other
 */
Rational& Rational::operator= (const Rational& other) {
    n_ = other.n_;
    d_ = other.d_;
    return *this;
}

/**
 * Insert r into or extract r from stream
 */

std::ostream& operator<< (std::ostream& out, const Rational& r) {
    return out << r.n_ << '/' << r.d_;
}

std::istream& operator>> (std::istream& in, Rational& r) {
    int n, d;
    if (in >> n && in.peek() == '/' && in.ignore() && in >> d) {
        r = Rational(n, d);
    }
    return in;
}}

Rational.h file:

 #ifndef RATIONAL_H_
#define RATIONAL_H_

#include <iostream>
class Rational {
    public:

        Rational ();

        /**
         * Creates a rational number with the given numerator and denominator
         */
        Rational (int n = 0, int d = 1);

        /**
         * Creates a rational number equivalent to other
         */
        Rational (const Rational& other);

        /**
         * Makes this equivalent to other
         */
        Rational& operator= (const Rational& other);

        /**
         * Insert r into or extract r from stream
         */
        friend std::ostream& operator<< (std::ostream &out, const Rational& r);
        friend std::istream& operator>> (std::istream &in, Rational& r);
    private:
    int n_, d_;};

    #endif

The function is from a pre-existing class called Rational which takes two ints as parameters. Here is the function to overload >> :

std::istream& operator>> (std::istream& in, Rational& r) {
        int n, d;
        if (in >> n && in.peek() == '/' && in.ignore() && in >> d) {
            r = Rational(n, d);
        }
        return in;
    }

And I'm trying to use it like this, after seeing a few tutorials. (The error I am getting is "Ambiguous overload for operator>> in std::cin>>n1 :

int main () {
// create a Rational Object.
    Rational n1();
    cin >> n1;
 }

Like I said I'm new to this whole overloading operators thing, and figure someone here would be able to point me in the right direction on how to use this function.

like image 691
user2333446 Avatar asked Dec 21 '22 06:12

user2333446


1 Answers

Change Rational n1(); to Rational n1;. You've ran into the most vexing parse. Rational n1(); does not instantiate a Rational object, but declares a function named n1 which returns a Rational object.

like image 65
Jesse Good Avatar answered Dec 24 '22 01:12

Jesse Good