Book.h
:Использование GetLine в перегруженном ввода оператора
#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
класса. title
и author
будут более одного слова, поэтому он подходит для использования 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
«s, это использовать это? Использует ли пользователь .ignore
, прежде чем вводит объект Book
, или автор класса поставил .ignore
в начале операции ввода?
Похоже, что в первом случае пользователь должен был бы понимать способ .ignore
, но при этом должен понимать реализацию входного оператора Book
, что нежелательно. В последнем случае оператор .ignore
в операторе означает, что мой оператор не может адаптироваться к определенным обстоятельствам, так как он всегда ожидает столкновения с новой строкой перед обработкой. Например, чтение из входного файла с данными, такими как:
book1
author1
1
book2
author2
2
Средства book1
получает игнорируются cin.ignore(256,'\n')
.
я бы сказал, что 'operator >>()' должен предположить, что файл находится в правильном положении, чтобы начать чтение. – Galik
Кроме того, для 'operator >>()' нечего делать, чтобы пропустить пробел перед чтением. – Galik
нормальным соглашением было бы считать поток в правильном положении в начале объекта для чтения. Вы определяете, может ли ваш объект начинать с новой строки или не может начинаться. Ваш абонент отвечает за позицию потока – Les