运算符<<重载不适用于复数
Operator<< Overloading not working right for complex numbers
我有一个编程任务,我必须重载运算符<<(istream,class)方法。
这个想法是您可以在命令控制台中键入一个复数,例如 5.6 + 6.7i 和然后,您可以使用 CIN 获取该数据并将其存储到 ComlexNumber 对象中。辛<<p>这是重载方法
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"字符的数字这一事实有关。奇怪的是,当我将值存储为整数但不存储双精度时,代码工作正常。有谁知道为什么会这样,是否有解决方案?
我必须承认我运行了你的代码并且它有效。我认为您在构造函数(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
尽管您的代码可以简化(并且可能更正为正确的输入运算符),但它实际上应该像它一样工作。它当然对我有用。您的 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 }
相关文章:
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- C++17 - 使用自定义分配器的节点提取/重新插入 - 适用于 clang++/libc++,但不适用于 libstd
- "string.h"在构建适用于iOS的qt应用程序中找不到消息
- 适用于 WebView2 旧版本的示例应用程序
- 在 NVIDIA GEFORCE GTX 1050 上下载适用于 Windows 10 的 openCL 1.2
- __attribute__(优化(0))) 是否适用于"recursively"?
- 为什么 std::erase(std::erase_if) 不是适用于<algorithm>任何容器的模板?
- 使用一个参数的模板函数时出错(适用于 2)
- 使用 适用于 Android 和 iOS 的 tf-lite C++ API
- 为什么这适用于 G++ 而不是 CLANG?
- 适用于 macOS 的 Xcode 应用程序。这就是我设置从USB麦克风输入获取音频的方式。一年前工作,现在没有了。为什么
- 适用于 Linux 的 c++ 上的代理脚本
- 为什么我的 SFINAE 表达式不再适用于 GCC 8.2?
- 使输出流式处理运算符适用于 boost::variant<std::vector<int>、int、double 的正确方法是什么>
- 有没有适用于Windows.lib文件的GNU二进制文件描述符(BFD)
- 模板函数仅适用于VS
- 如何在cmake中包含适用于g++或viceversa的库
- 适用于win32、linux、mac的POSIX C包装器
- WinDBG适用于从Visual Studio 2015保存的转储,但不适用于任务管理器。显示异常代码"not found"
- 从uint8_t到NPY_UINT16 PyArray_SimpleNewFromData.适用于Linux,但不适用于