我正在重载流提取操作符,因此它可以在我创建的Complex类中使用。当我使用cin从from(x,y)中的用户输入一个复数时,它工作正常。请注意,我忽略了这些字符"(,)"。因为我只想要数字。
但是当我尝试以相同的格式从用户输入两个数字时,无论输入什么值,程序都会返回(0,0)作为答案。看起来程序无法忽略这些字符,在这种情况下。我无法找到解决此问题的方法。这是文件。
请仔细查看main.cpp和输出。我输入了这样的值,
(2,3)
(5,6)
如何编辑此代码,以便即使输入一个复数或输入更多数字也能正常工作?
Complex.h
#pragma once
#include <iostream>
using namespace std;
#ifndef COMPLEX_H
#define COMPLEX_H
class Complex {
public:
// constructors
Complex(double, double);
Complex(double);
Complex();
friend ostream & operator<<(ostream &,Complex &);
friend istream & operator>>(istream &, Complex &);
private:
double r;
double i;
};
#endif
Complex.cpp
#include <iostream>
using namespace std;
#include "Complex.h"
Complex::Complex(double _r, double _i){
r=_r;
i=_i;
}
Complex::Complex(double _r){
r=_r;
i=0.0;
}
Complex::Complex(){
r=0.0;
i=0.0;
}
// Code for overloading stream insertion operator.
ostream& operator<<(ostream& os, Complex& value){
os << "(" << value.r <<", " << value.i << ")" ;
return os;
}
// Code for overloading stream extraction operator.
istream & operator>>(istream& is, Complex& val){
is.ignore();
is >>val.r;
is.ignore();
is >>val.i;
return is;
}
的main.cpp
#include <iostream>
#include "Complex.h"
using namespace std;
int main(){
Complex x,y;
cout<<"Enter complex number in the form(x,y): "<<endl;
cin>>x>>y;
cout<<"\nThe 1st complex number entered was "<<x<<endl;
cout<<"\nThe 2nd complex number entered was "<<y<<endl;
}
输出
输入的第一个复数是(2,3)
输入的第二个复数是(0,0)
答案 0 :(得分:4)
@Holt是对的,第二次调用ignore()
时的第一个operator>>()
调用正在丢弃前一个输入中的剩余换行符。如果预先清除了角色(可能通过在从函数返回之前清空空格或进入时),它就可以工作。
更直观的方法是编写自己的skip<>
函数模板,首先清除空格,然后丢弃您提供的字符(如果存在)。典型的实现如下所示:
template<char n>
std::istream& skip(std::istream& is)
{
if ((is >> std::ws).peek() != n)
is.setstate(std::ios_base::failbit);
else
return is.ignore();
return is;
}
您可以在提取器中使用它,如下所示:
std::istream& operator>>(std::istream& is, Complex& val) {
is >> skip<'('> >> val.r >> skip<','> >> val.i >> skip<')'>;
return is;
}
答案 1 :(得分:1)
std::istream::ignore
将忽略流中的n
个字符(默认情况下为1
)。在您的情况下,下一个被忽略的字符是\n
字符(换行符),因此下一条指令尝试从double
读取(
,这显然会失败,因此val.r
的值1}}和val.i
未更改并保留0.0
。