分享

在c中重载流提取操作符

 印度阿三17 2019-08-30

我正在重载流提取操作符,以便它可以在我创建的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;

} 

产量

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

The second complex number entered was (0,0)

解决方法:

@Holt是对的,第二次调用运算符>>()中的第一个ignore()调用正在丢弃前一个输入中的剩余换行符.如果角色事先已被清除(可能通过在从函数返回之前清空空格或进入时),它就会起作用.

更直观的方法是编写自己的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;
}
来源:https://www./content-4-426301.html

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多