gpt4 book ai didi

c++ - 在 C++ 中重载流提取运算符

转载 作者:太空狗 更新时间:2023-10-29 20:59:25 27 4
gpt4 key购买 nike

我正在重载流提取运算符,以便它可以在我创建的 Complex 类中使用。当我使用 cin 在 from(x,y) 中从用户输入一个复数时,它工作正常。请注意,我忽略了这些字符“(,)”。因为我只想要数字。

但是当我尝试以相同的格式从用户输入两个数字时,无论输入什么值,程序都会返回 (0,0) 作为答案。看起来程序无法忽略这些字符,在这种情况下。我无法找到解决这个问题的方法。这是文件。

请仔细查看 main.cpp 和输出。我输入了这样的值,

(2,3)
(5,6)

如何编辑此代码,使其即使在输入一个或多个复数时也能正常工作?

复杂.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

复杂.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;
}

主要.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;

}

输出

The 1st complex number entered was (2,3)

The second complex number entered was (0,0)

最佳答案

@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;
}

关于c++ - 在 C++ 中重载流提取运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24722440/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com