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