Почему строковая версия getline не является функцией-членом? - PullRequest
8 голосов
/ 14 декабря 2010

Функция getline имеет символьную версию , которая является функцией-членом, а также глобальную версию , которая принимает строки. Почему они не являются членами-функциями? При нынешнем способе создается впечатление, что нет строковой версии.

Ответы [ 3 ]

5 голосов
/ 14 декабря 2010

istream& istream::getline(char* s, streamsize n) является частью интерфейса потока.

istream& getline(istream& is, string& str) - это метод extension из библиотеки string (как и istream &operator>>(istream&, string&)).

Этот дизайн, вероятно, был выбран для отделения iostreams от строки , поскольку fstream::open() также не принимает std::string аргументов, а скорее const char*.

2 голосов
/ 14 декабря 2010

Поскольку реализация классов iostream не должна зависеть от строк.

1 голос
/ 14 декабря 2010

Проблема с потоковой библиотекой заключается в том, что она плохо спроектирована. В частности, функция-член getline вообще не должна быть там. Свободная функция getline подходит именно ему, она имеет несколько преимуществ: она не является функцией-членом, она безопасна, не работает с необработанными буферами и не требует догадок.

Необходимо отметить, что как членские, так и свободные функции являются частью открытого интерфейса istream.

...