【问题标题】:Overloading the istream >> operator for a rational number class. Don't know how to deal with integers为有理数类重载 istream >> 运算符。不知道如何处理整数
【发布时间】:2016-05-28 12:51:56
【问题描述】:

我正在学习 C++,并且正在做一个项目来处理一个表示有理数(例如 ½)的类。我重载了 istream >> 运算符,以便它正确地从流中读取有理数。

我在将整数输入流中以获得有理数时遇到问题。例如,如果有人键入 2,我希望它从流中读取为 2/1。有人告诉我使用 peek() 函数会起作用,但我不知道如何。代码如下:

std::istream& operator>>(std::istream& is, Rational& r)
{
  int p, q;
  char c;
  is >> p >> c >> q;

  if (!is)
    return is;

  // Require that the divider to be a '/'.
  if (c != '/') {
    is.setstate(std::ios::failbit);
    return is;
  }

  // Make sure that we didn't read p/0.
  if (q == 0) {
    is.setstate(std::ios::failbit);
    return is;
  }

  r = Rational(p, q);
  return is;
}

除非输入整数,否则它可以完美运行;我希望它被读作(int)/1

有什么建议吗?

【问题讨论】:

  • 我不完全理解你。你希望22/1 一样好,但不是2/somethinginvalid
  • 如果您考虑一下,您正在执行 3 次读取...所以如果您希望某人能够输入 1 项(例如“2”)或 3 项(例如“2 " "/" "3") 你真正需要做的是一次读取整行,然后解析它。

标签: c++ overloading operator-keyword istream peek


【解决方案1】:

如果您打破is >> p >> c >> q; 可能会有所帮助,因此您可以在每次提取后检查流的状态(并执行peeking):

int p, q = 1; // default is 1

if(!(is >> p))
    ; // p is not good, handle it

if(is.peek() == '/')
{
    // there's an /
    is.ignore(1); // or is.get() to skip over it

    if(!(is >> q))
        ; // q is not good, handle it
}

// the following shall not be executed if extraction of q or p fails
r = Rational(p, q);

变量c 可能不需要。此外,如果有 1? 之类的内容,这将显示为 1,将 ? 保留在流中,您将得到 1/1。它不是那么贪婪(你可以改变它)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-18
    • 1970-01-01
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-13
    • 2016-11-11
    相关资源
    最近更新 更多