重载>>运算符

overloading the >> operator

本文关键字:gt 运算符 重载      更新时间:2023-10-16

我遇到了麻烦,事实上我卡住了。我必须为有理数定义一个类.现在其中一部分是重载输入和输出运算符,现在我已经为输出运算符完成了它,但我坚持输入。这是我被卡住的程度

    istream& operator >>(istream& ins, rational& frac)
{
    int numerator, denominator;
    ins >> numerator;
    if()
    return ins;
}

我的问题是我如何使它们分开分子和分母。 如果有帮助,我的类头如下。

#ifndef RAT_H
#define RAT_H
#include <iostream>
#include <cstring>
using namespace std;
class rational
{
    public:
        rational();
        rational(int n,int d);
        rational(int whole_number);
        friend ostream& operator <<(ostream& outs, const rational& frac);
        friend istream& operator >>(istream& ins, rational& frac);
    private:
        void split(string fract);
        int numerator;
        int denominator;
        string farray[2];
        string fraction;
};
#endif // RAT_H

输出操作器执行以下操作:

ostream& operator <<(ostream& outs, const rational& frac)
{
    outs << frac.numerator<<'/'<<frac.denominator;
    return outs;
}

你真正需要做的就是

  1. 读取分子
  2. 如果成功,请查看下一个角色是否是'/',如果是,则ignore()它。
  3. 阅读分母。
  4. 设置值。

所以,真正需要的是

int numerator, denominator;
if (in >> numerator
    && (in >> std::ws).peek() == '/'
    && in.ignore() >> denominator) {
    ...
}

唯一棘手的业务是使用std::ws如果有的话,它会跳过空格。您的格式实际上并不需要它。

你还没有真正深入到足够的细节,你是什么愿意接受作为输入,但通常的处理解决方案分离器是定义一个拾取它们的操纵器,并且设置failbit如果它们不存在。 像这样:

class CheckedSeparator
{
    char m_separ;
public:
    CheckedSeparator( char separ ) : m_separ( separ ) {}
    friend std::istream& operator>>( std::istream& source, 
                                     CheckedSeparator const& dest )
    {
        char separSeen;
        source >> separSeen;
        if ( separSeen != dest.m_separ ) {
            source.setstate( std::ios_base::failbit );
        }
        return source;
    }
};

如果这样做,则无需if

std::istream&
operator>>( std::istream& source, Rational& frac )
{
    int n;
    int d;
    source >> n >> CheckedSeparator('/') >> d;
    if ( source ) {
        frac = Rational( n, d );
    }
    return source;
}