在重载的输入操作符

时间:2015-09-29 17:49:48

标签: c++ input operator-keyword getline

Book.h

#ifndef BOOKDATE
#define BOOKDATE

#include <iostream>
#include <string>

class Book{
    friend std::istream& operator>>(std::istream&, Book&);
private:
    std::string title, author;
    int number;
};

std::istream& operator>>(std::istream&, Book&);

#endif // BOOKDATE

Book.cpp

#include "BookDate.h"    
using namespace std;

istream& operator>>(istream& is, Book& rhs){
    getline(is, rhs.title); 
    getline(is, rhs.author);
    is >> rhs.number;
    if(!is)
        rhs = Book();
    return is;
}

我想知道我应该如何为Book类创建输入运算符。 titleauthor将不止一个字,因此我需要使用getline来接收该数据。 getline的问题在于,自上次使用'\n'以来,它可能会在流中留下任何cin。例如;

int x;
cin >> x; //newline is not extracted and left behind
Book a;
cin >> a; //"title" is automatically made empty!

我可以使用cin.ignore(256, '\n'),但是他/她的责任,用户或类author是否可以使用它?用户在输入.ignore对象之前是否使用Book,或者类作者是否在输入操作开始时放置.ignore

似乎在前一种情况下,用户必须理解需要.ignore方法,但这样做必须了解Book输入运算符的实现,是不可取的。在后一种情况下,将.ignore放在运算符中意味着我的运算符可能无法适应某些情况,因为它总是希望在处理之前遇到换行符。例如,使用以下数据从输入文件中读取:

book1
author1
1

book2
author2
2

book1忽略了cin.ignore(256,'\n')次方式。

3 个答案:

答案 0 :(得分:0)

要使operator>>的行为更像内置类型的运算符,您可以在阅读输入之前使用ws操纵器跳过空格。

只需使用

is >> ws;

在输入运算符的开头,流将位于当前位置之后的第一个非空白字符处。

答案 1 :(得分:0)

要正确地重载提取操作符,您可以将输入格式更改为要填充的三个变量的序列,即:

git push -f

并将您的(title, author, number) 修改为:

operator>>

答案 2 :(得分:-1)

is.ignore();之前放入getline(is, rhs.title);