#include <iostream>
#include <fstream>
using namespace std;
int main () {
ofstream myfile;
myfile.open ("test.txt");
return 0;
}
fstream是从iostream派生的,为什么我们应该在上面的代码中包含两者?
我删除了fstream但是,ofstream存在错误。我的问题是ofstream是从ostream派生出来的,为什么需要fstream才能编译?
答案 0 :(得分:22)
您需要包含fstream
,因为这是ofstream
类的定义所在。
你有点反过来:因为ofstream
来自ostream
,fstream
标题包含iostream
标题,所以你可以省略{{1}它仍然会编译。但是你不能遗漏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
的定义?
请记住,在C和C ++中,B
是文字的。它实际上粘贴了include
语句所在的包含文件的内容。这不像是一个更高级别的声明,“在这个班级中给我一切。”
答案 1 :(得分:5)
std::ofstream
在<fstream>
标准库标头中定义。
您需要为其定义包含该标头,以便您可以实例化它。
答案 2 :(得分:0)
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>
)。