刚接触 c++ 和重载运算符,不确定如何使用该函数

Posted

技术标签:

【中文标题】刚接触 c++ 和重载运算符,不确定如何使用该函数【英文标题】:New to c++ and Overloading operators, unsure how to use the function 【发布时间】:2013-04-23 14:30:50 【问题描述】:

您好,我是 C++ 的新手,在学习了一些 Java 基础知识后才开始学习它。 我有预先存在的代码,如果它重载了 >> 运算符,但是在看了很多教程并试图理解这个问题之后,我想我会在这里问。

合理的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

该函数来自一个名为 Rational 的预先存在的类,它接受两个 ints 作为参数。这是重载&gt;&gt;的函数:

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&gt;&gt; in std::cin&gt;&gt;n1

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

就像我说的那样,我对整个重载运算符这件事很陌生,并且认为这里有人能够为我指出如何使用这个函数的正确方向。

【问题讨论】:

【参考方案1】:

Rational n1(); 更改为Rational n1;。您遇到了most vexing parse。 Rational n1(); 不会实例化 Rational 对象,而是声明一个名为 n1函数,它返回一个 Rational 对象。

【讨论】:

哇!如果它出现在我的代码中,我永远不会追踪它。 @NemanjaBoric,当然可以。它通常就像打开编译器警告一样简单。 好的,我这样做了,然后它说':Rational(int,int)''我认为它需要整数作为参数?但是这些参数是从用户输入中接收的。 @user2333446,我不知道为什么它不包含默认构造函数,但如果你不能更改类,我只会提供两个虚拟值。 @user2333446:正如克里斯所说,你能改变班级吗?如果没有,只需提供两个虚拟值。【参考方案2】:
// create a Rational Object.
    Rational n1();

this 不会创建新对象,而是声明一个不带参数并返回 Rational 的函数 你可能是说

// create a Rational Object.
    Rational n1;
    cin>>n1;

【讨论】:

以上是关于刚接触 c++ 和重载运算符,不确定如何使用该函数的主要内容,如果未能解决你的问题,请参考以下文章

C++:使用类|| 运算符重载友元

[ C++ ] C++类与对象(中) 类中6个默认成员函数 -- 运算符重载

C++,如何在派生类中调用基类的重载提取运算符?

c++中重载输出操作符,为啥要返回引用

c++中拷贝构造函数和赋值运算符重载本质上一样么

c++ 拷贝构造函数与赋值运算符重载函数的区别是