简单地说:ostringstream
提供了一个streambuf
, ostream
要求用户提供一份。
要理解其中的含义,有必要了解一点
流是如何工作的,我不确定网络上对此有很好的解释。基本抽象
的ostream
正在格式化文本输出。你给它一个int
or a
double
(或者用户定义的类型——稍后会详细介绍),并且它
将其转换为类型的字符流char
。它能做什么
该流取决于streambuf
附在其上的;
这是策略模式的一个示例,其中streambuf
是一个
策略的抽象基类[1]。该标准提供了两种
的实施streambuf
, filebuf
and stringbuf
;在实践中,
在除了最琐碎的应用程序之外的所有应用程序中,您可能会遇到一些
你自己实现。
输出时,总是使用ostream
;这是一个类<<
定义了运算符。您正在将数据格式化为流
字符,并且您并不真正关心流的最终位置。
创建实例时:如果创建ostream
,您必须提供
它与一个streambuf
你自己。更多时候,您将创建一个ofstream
or an ostringstream
。这些都是“便利”课程,
其源自ostream
,并提供一个streambuf
为了它 (filebuf
and stringbuf
, 当它发生的时候)。实际上,all他们所做的是
提供必要的streambuf
(这会影响构造函数和
析构函数,而不是其他);如果是ofstream
, 那里
还有一些额外的功能,它们转发到附加功能
这filebuf
界面。
当您定义自己的时,这是常见的(但绝不是必需的)streambuf
提供方便的超载ostream
(and
istream
,如果相关的话),与ofstream
or
ostringstream
.
出于同样的原因,在创建实例时,通常会使用以下之一
“方便”派生类,而不是使用ostream
直接地
并提供您自己的streambuf。
如果这一切看起来很复杂:iostream 类只使用
关于 C++ 的所有功能(虚拟函数、模板和
函数重载都发挥着重要作用)。如果你只是
学习 C++,不用太担心:只需使用ofstream
or
ostringstream
当你构造一个实例,但传递
参考ostream
。当您了解虚拟技术等技术时
函数、模板和运算符重载,返回到 iostreams
了解它们在使代码更加灵活方面发挥的作用。
[1] 由于种种原因,std::streambuf
实际上并不抽象。但
其中的虚函数的实现是没有用的;
提取总是返回 EOF,而插入总是失败。