我有一个编程任务,我必须重载运算符<<(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'字符旁边的数字。奇怪的是,当我将值存储为整数而不是双精度时,代码工作正常。有谁知道为什么会这样,如果有解决方案吗?
答案 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;
}
我尝试过输入:
答案 1 :(得分:0)
虽然您的代码可以简化(并且可能被修正为适当的输入操作符),但它实际上应该可以正常工作。它确实对我有用。 ComplexNumber
的构造函数是否同时设置了real
和imag
部分?
以下是一些建议:
使用std::ws
操纵器可以更轻松地跳过空格:
in >> std::ws;
当然,如果您只是使用_operator
的格式化读取,您可以一次性读取整个值:
char _operator, i;
if (in >> real >> _operator >> imag >> i) { ... }
您的代码当前在流中留下了i
。相反,它应该可以读取值并验证确实存在'i'
字符。
正确的输入操作符以创建sentry
对象开始:此对象刷新潜在的tie()
d输出流(例如,std::cout
为tie()
d到std::cin
),跳过前导空格,并检查流是否良好:
std::istream::sentry cerberos(in);
if (cerberos) {
// the main operation goes here
}