4

こんにちは、私は C++ の初心者です。Java の基本をいくつか学んだ後、C++ の学習を始めたばかりです。オペレーターをオーバーロードした既存のコードがありますが、>>多くのチュートリアルを見て問題を理解しようとした後、ここで質問することにしました。

合理的な cpp ファイル:

 #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 ファイル:

 #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

intこの関数は、パラメーターとして2 つの を受け取る Rational という既存のクラスからのものです。オーバーロードする関数は次の>>とおりです。

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

そして、いくつかのチュートリアルを見た後、このように使用しようとしています。(私が得ているエラーは次のとおり"Ambiguous overload for operator>>ですstd::cin>>n1

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

私が言ったように、私はこのオーバーロード演算子全体に不慣れであり、ここの誰かがこの関数の使用方法について正しい方向に向けることができると考えています。

4

2 に答える 2

10

に変更Rational n1();Rational n1;ます。最も厄介な parseに遭遇しました。Rational n1();オブジェクトをインスタンス化するのではなく、オブジェクトを返すという名前の関数Rationalを宣言します。n1Rational

于 2013-04-29T19:42:59.257 に答える
1
// create a Rational Object.
    Rational n1();

Rational これは新しいオブジェクトを作成しませんが、引数を取らず、おそらく意図したものを返す関数を宣言します

// create a Rational Object.
    Rational n1;
    cin>>n1;
于 2013-04-29T19:49:02.597 に答える