Зачем мне включать заголовки iostream и fstream, чтобы открыть файл - PullRequest
18 голосов
/ 16 марта 2010
#include <iostream>
#include <fstream>
using namespace std;

int main () {
  ofstream myfile;
  myfile.open ("test.txt");
  return 0;
}

fstream является производным от iostream. Почему мы должны включить оба кода в приведенный выше код?

Я удалил fstream, однако есть ошибка с ofstream. Мой вопрос о ofstream является производным от ostream. Почему fstream необходим для его компиляции?

Ответы [ 3 ]

22 голосов
/ 16 марта 2010

Вы должны включить fstream, потому что именно здесь определение класса ofstream.

Вы получили это назад: поскольку ofstream происходит от ostream, заголовок fstream включает заголовок iostream, так что вы можете опустить iostream, и он все равно будет скомпилирован. Но вы не можете пропустить fstream, потому что тогда у вас нет определения для ofstream.

Думайте об этом так. Если я введу это в a.h:

class A {
  public:
    A();
    foo();
};

А потом я делаю класс, который наследуется от A в b.h:

#include <a.h>

class B : public A {
  public:
    B();
    bar();
};

А потом я хочу написать эту программу:

int main()
{
  B b;
  b.bar();

  return 0;
}

Какой файл мне нужно включить? b.h очевидно. Как я могу включить только a.h и рассчитывать на определение для B?

Помните, что в C и C ++ include является буквальным. Он буквально вставляет содержимое включенного файла, в котором находился оператор include. Это не похоже на высказывание более высокого уровня «дай мне все в этой семье классов».

5 голосов
/ 16 марта 2010

std::ofstream определяется в заголовке стандартной библиотеки <fstream>.

Вам нужно включить этот заголовок для его определения, чтобы можно было его создать.

0 голосов
/ 17 марта 2016

typedef ofstream и связанный с ним шаблон класса определены как #include <fstream>, поэтому вам нужен этот заголовок.

Для вашей программы #include <iostream> не требуется. Но вы можете использовать объект fstream с некоторыми функциями, которые работают на ostream или istream s.

Эти функции не определены #include <fstream>, и вам необходимо включить правильный заголовок для любых функций, которые вы используете. В некоторых реализациях #include <fstream> может также включать <iostream>, но это не гарантируется стандартом C ++.

Например, этот код:

ofstream myfile;
myfile.open ("test.txt");

myfile << 1;

требует #include <ostream> (или, поскольку C ++ 11, #include <iostream>, который гарантированно вводит #include <ostream>).

...