0

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

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

2 回答 2

3

你真正需要做的就是

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

所以,真正需要的是

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

唯一棘手的事情是使用std::ws它会跳过空格(如果有的话)。您的格式并不真正需要它。

于 2013-09-26T18:19:25.750 回答
0

您还没有真正深入了解您愿意接受什么作为输入,但处理分隔符的常用解决方案是定义一个操纵器来拾取它们,并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;
}
于 2013-09-26T18:19:06.013 回答