【问题标题】:overloaded stream extraction operator重载流提取运算符
【发布时间】:2013-02-09 16:41:46
【问题描述】:

我试图输入一个复数并使用重载运算符来处理实部和虚部的解析。如果我输入像1 + 2i 这样的数字,我想要real = 1imaginary = 2

现在如果我输入1 + 2i 输入,输出是1 + 0i。我怎样才能正确地做到这一点(号码有私人数据成员realimaginaryoperator>>是一个朋友功能)

//input the form of 1 + 2i
istream & operator>>(istream &in, Number &value)
{    
    in >> std::setw(1) >> value.real;
    in.ignore(3); //skip 'space' and '+' and 'space'
    in >> std::setw(1) >> value.imaginary;
    in.ignore(); //skip 'i'

    return in;
}


//output in the for 1 + 2i
ostream &
operator<<(ostream &out, const Complex &value)
{
    out << value.real << " + " << value.imaginary << "i" <<std::endl;

    return out;
}

【问题讨论】:

  • 你试过使用调试器吗?
  • 顺便说一句,this one 为我工作
  • 该代码有什么错误?

标签: c++ operator-overloading cin


【解决方案1】:

您的代码在我的编译器上运行良好!也许问题出在其他地方(例如在输出中)?

请注意std::setw 在从输入流中提取数字时无效。

请记住,您可能还需要考虑以下形式的情况:A - Bi,并且可能如果用户决定在运算符或i 周围插入额外的或删除空格。但是对于简单的情况A + Bi,您的原型应该不是问题。

【讨论】:

  • "std::setw 是一个修改输出的函数,因此对您的代码没有任何影响。" 这不是真的。 Example
  • 还是错了。它限制了您可以提取的字符数。
  • 您能否展示一个测试用例,因为我在任何编译器中都没有看到这种行为?
  • 我应该更具体一点:它当然适用于字符串,而不是整数 :) 请参阅我的第一条评论中的链接,将 stdin 数据与输出进行比较。
  • 嗯,是的,这就是我更新声明以反映这一点的原因。 std::setw提取数字时没有效果”还是错了吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-10
  • 2012-02-10
  • 1970-01-01
  • 2012-09-19
相关资源
最近更新 更多