“std::ostream”没有名为“close”的成员

nob*_*bar 6 c++ iostream

std::ostream没有成员函数close()。我不应该允许关闭什么类型的流?

\n\n

例如,也许我想关闭std::cout以防止进一步写入。

\n\n
std::cout.close(); // \xe2\x80\x98std::ostream\xe2\x80\x99 has no member named \xe2\x80\x98close\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我使用 C 库,我可以stdout这样结束:

\n\n
fclose(stdout); // no problem\n
Run Code Online (Sandbox Code Playgroud)\n\n

close()那么排除该成员背后的想法是什么std::ostream

\n\n
\n\n

有关的:

\n\n\n

men*_*dal 6

拥有close()作为 的成员的功能是没有意义的std::ostream。第一个例子是std::ostringstream继承自std::ostream. 关闭字符串有意义吗?的唯一成员std::ostream是输入/输出的全局对象。

文件流有一个close()功能,因为能够将资源释放到环境中非常重要。但是,由于有其他继承自该基类的类不需要此函数,因此将其作为其中的一部分是没有意义的std::ostream,这就是它仅在文件流中使用的原因。

  • 有道理,只是我不明白为什么 `std::ostringstream` 不应该是可关闭的。与明显与特定子类相关的“open()”不同,“close()”是一个非常通用的操作,对任何类型的流都有意义——它只意味着您已完成写入以及任何未来的写入操作可能应该返回一个错误。从概念上讲,它至少与“ostream”提供的“flush()”一样通用。但你是对的——对于某些类型的流来说,“close()”比其他类型更“必要”。 (2认同)