Почему методы fstream возвращают ссылки на "* this"? - PullRequest
1 голос
/ 30 марта 2012

Я недавно начал писать код на C ++, но долгое время писал на C. Так что я читаю методы из класса fstream, и я понял, что каждый метод, который может быть процедурой (ничего не возвращающей),возвращая ссылку на объект, вызвавший его метод.(например, fstream & fstream :: read (char_type * __s, streamsize __n)).

Почему это сделано?

Я кодирую небольшой слой поверх класса fstream, поэтому ямне интересно, если я должен вернуть ссылку в моих методах чтения тоже.

Спасибо.

Ответы [ 3 ]

6 голосов
/ 30 марта 2012

Возврат ссылки на сам объект потока дает вам отличный способ проверить достоверность операций ввода / вывода: если операция завершается неудачей, объект потока находится в состоянии сбоя, что означает, что он будет оцениваться до false в логическом контексте. Таким образом мы можем написать:

while (std::getline(instream, str)) { /* ... process line ... */ }

if (anotherstream >> x >> y) { /* process x and y */ }
else { /* error, at least one extraction failed */ }

if (!laststream.read(buf, sizeof(buf)) { /* error */ }

Обратите внимание, в частности, на повторный вызов во втором примере: каждое извлечение возвращает ссылку на объект потока, и поэтому мы можем объединить несколько извлечений в одном операторе, и если любой из них завершится неудачно, все Операция оценит false.

Вот практический пример, разбор строк вида [x y z] из стандартного ввода:

for (std::string line; std::getline(std::cin, line); )
{
    std::istringstream iss(line);
    char l, r;
    double x, y, z;

    if (!(iss >> l >> x >> y >> z >> r) || (l != '[') || (r != ']'))
    {
        std::cerr << "Malformed line ('" << line << "'), skipping.\n";
        continue;
    }

    std::cout << "You said: " << x << ", " << y << ", " << z << std::endl;
}
5 голосов
/ 30 марта 2012

http://en.wikipedia.org/wiki/Method_chaining

https://isocpp.org/wiki/faq/references#method-chaining

Вот почему:

cout << "Hello " << "World"; 

работает.

(Хотя, как указал Лучиан Григоре, cout не является fstream. Хотя та же самая идея применима, и его ответ предлагает пример fstream.)

4 голосов
/ 30 марта 2012

Вы можете использовать метод цепочки .

stream << "foo";
stream << "bar";

можно заменить на

stream << "foo" << "var";
...