运营商LT;<重载不适合复杂的数字

时间:2013-11-17 02:34:20

标签: c++ operator-overloading istream

我有一个编程任务,我必须重载运算符<<(istream,class)方法。

这个想法是你可以在命令控制台中键入一个复杂的数字,如5.6 + 6.7i和 然后你可以使用cin来获取数据并将其存储到ComlexNumber对象中。 CIN<

这是重载方法

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'字符旁边的数字。奇怪的是,当我将值存储为整数而不是双精度时,代码工作正常。有谁知道为什么会这样,如果有解决方案吗?

2 个答案:

答案 0 :(得分:0)

我必须承认我运行了你的代码并正常工作。我认为您的构造函数(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

答案 1 :(得分:0)

虽然您的代码可以简化(并且可能被修正为适当的输入操作符),但它实际上应该可以正常工作。它确实对我有用。 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
    }