重载流提取运算符

Posted

技术标签:

【中文标题】重载流提取运算符【英文标题】: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 为我工作 该代码有什么错误? 【参考方案1】:

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

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

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

【讨论】:

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

以上是关于重载流提取运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++ 输入/输出运算符重载

输入输出运算符重载

[ C++ ] 类与对象(下)日期类Date补充及流提取和流插入运算符重载

C++重载IO输入输出流运算符

C++重载IO输入输出流运算符

C++重载IO输入输出流运算符