Почему я должен включать и iostream и fstream заголовки для открытия файла

#include <iostream>
#include <fstream>
using namespace std;

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

fstream получен из iostream, почему мы должны включать обоих в код выше?

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

17
задан jalf 16 March 2010 в 03:07
поделиться

2 ответа

Вам необходимо включить fstream , потому что там находится определение класса ofstream .

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

Подумайте об этом так. Если я помещу это в ah :

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

И затем я создам класс, производный от A в bh :

#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 . Это не похоже на заявление более высокого уровня «дай мне все в этом семействе классов».

21
ответ дан 30 November 2019 в 12:57
поделиться

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

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

5
ответ дан 30 November 2019 в 12:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: