【问题标题】:Operator<< Overloading not working right for complex numbers运算符<<重载不适用于复数
【发布时间】:2013-11-30 08:18:37
【问题描述】:

我有一个编程任务,我必须重载 operator

这个想法是您可以在命令控制台中输入一个复数,例如 5.6 + 6.7i 和 然后您可以使用 cin 获取该数据并将其存储到 ComlexNumber 对象中。 辛

这里是重载的方法

istream & operator>>(istream & in, ComplexNumber & n){
double real;
double imag;
in>>real;
char _operator;
in.get(_operator);
while(_operator == ' ' || _operator == '\n' || _operator == '\t'){
    in.get(_operator);
}
int mult;
switch(_operator){
    case '+':
        mult = 1;
        break;
    case '-':
        mult = -1;
        break;
    default :
        in.setstate(ios::failbit);
        return in;              
};
in>>imag;
imag *= mult;   
n = ComplexNumber(real,imag);
return in;
}

问题是,当我尝试使用控制台测试代码时,当我输入一个复数时,只有数字的实部得到正确的值,而虚部总是得到 0。我认为这与我正在尝试解析紧挨着“i”字符的数字这一事实。奇怪的是,当我将值存储为整数而不是双精度时,代码运行良好。有谁知道这是为什么以及是否有解决方案?

【问题讨论】:

标签: c++ operator-overloading istream


【解决方案1】:

我必须承认我运行了您的代码并且它有效。我认为您的构造函数 (ComplexNumber(double,double)) 或重载的 operator = 有问题。这是我的测试代码:

#include <iostream>

using namespace std;

class ComplexNumber{
   friend istream & operator>>(istream &in, ComplexNumber &in);
}; 

istream & operator>>(istream & in, ComplexNumber & n){
double real;
double imag;
in>>real;
char _operator;
in.get(_operator);
while(_operator == ' ' || _operator == '\n' || _operator == '\t'){
    in.get(_operator);
}
int mult;
switch(_operator){
 case '+':
     mult = 1;
     break;
 case '-':
     mult = -1;
     break;
 default :
     in.setstate(ios::failbit);
     return in;              
};
in>>imag;
imag *= mult;   
cout << real << " " << imag << endl;
return in;
} 

int main(){
   ComplexNumber c;
   cin >> c;

   system("pause");
   return 0;
}

我试过输入:

  • 3.0+2.0i
  • 1-2
  • 1231.1231+234.41i
  • 214 +3.14

【讨论】:

  • 我在学校的计算机上尝试了我的代码,它确实可以正常工作,只是在我的计算机上不行。你用的是什么版本的 g++?
  • 我使用的是 DevC++ 4.9.9.2,它使用 gcc 版本 3.4.2 (mingw-special) 作为编译器。
【解决方案2】:

虽然您的代码可以简化(并且可能更正为正确的输入运算符),但它实际上应该可以正常工作。它当然对我有用。 ComplexNumber 的构造函数是否同时设置了 realimag 部分?

以下是一些建议:

  1. 使用std::ws 操纵器可以更简单地跳过空格:

    in >> std::ws;
    

    当然,如果您只是对_operator 使用格式化读取,您可以一次性读取整个值:

    char _operator, i;
    if (in >> real >> _operator >> imag >> i) { ... }
    
  2. 您的代码当前将尾随 i 留在流中。相反,它应该读取该值并验证确实存在'i' 字符。

  3. 您应该始终检查读取成功读取的值!
  4. 正确的输入运算符从创建sentry 对象开始:此对象刷新潜在的tie()d 输出流(例如,std::couttie()d 到std::cin),跳过前导空格,并且检查流是否良好:

    std::istream::sentry cerberos(in);
    if (cerberos) {
        // the main operation goes here
    }
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2019-10-03
    相关资源
    最近更新 更多