c++ - 为什么我需要同时包含 iostream 和 fstream header 才能打开文件

标签 c++ iostream

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

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

fstream 是从iostream 派生出来的,为什么我们要把两者都包含在上面的代码中?

我删除了 fstream,但是,ofstream 有一个错误。我的问题是 ofstream 是从 ostream 派生的,为什么需要 fstream 才能编译?

最佳答案

您需要包含 fstream,因为这是 ofstream 类的定义所在。

你有点倒退了:由于 ofstream 派生自 ostreamfstream header 包含 iostream header ,因此您可以省略 iostream 并且它仍然可以编译。但是您不能遗漏 fstream,因为这样您就没有 ofstream 的定义。

这样想。如果我把它放在 a.h 中:

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

然后我在 b.h 中创建一个派生自 A 的类:

#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 语句所在的位置。这不像是“给我这个类(class)的一切”的更高层次的说法。

关于c++ - 为什么我需要同时包含 iostream 和 fstream header 才能打开文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55945907/

相关文章:

c++ - 为什么这个未打开的 ifstream 在我尝试从中提取后仍然是 "good"?

c++ unordered_set with shared_ptr 搜索原始指针

c++ - 如何在不使用 iostream 的情况下构建 Google protobuf?

c++ - 正在打印空指针未定义行为吗?

C++ 验证 - 截断设置为下一个输入

c++ - 如何将模式从Dev-C++中的c++ 98模式更改为支持C++ 0x(基于范围)的模式?

c++ - 非循环访问者模式。将接受功能移动到一个地方

c++ - 标签分发中的转发参数

c++ - 全屏模式下的Allegro颜色变化

boost - 在应用程序的 WDK 构建环境中使用 boost?