3

在 C++98 之前,在 C++ I/O 类层次结构中有 3 个名为iostream_withassign, ostream_withassign&的类istream_withassign

类的成员函数iostream_withassign

构造函数和析构函数

~iostream_withassign

public:virtual ~iostream_withassign()

iostream_withassign

public:iostream_withassign()

创建一个 iostream_withassign 对象。它不对该对象进行任何初始化。

运算符 =

public:iostream_withassign& operator =(iostream_withassign& rhs)

赋值运算符 operator =

过载 1

public:iostream_withassign& operator =(streambuf*)

此赋值运算符采用指向 streambuf 对象的指针并将此 streambuf 对象与赋值运算符左侧的 iostream_withassign 对象相关联。

过载 2

public:iostream_withassign& operator =(ios&)

此赋值运算符采用对 ios 对象的左值引用,并将附加到此 ios 对象的流缓冲区与赋值运算符左侧的 iostream_withassign 对象相关联。

来源:这个

同样的方式是这样说的:

ostream_withassign 类是允许对象分配的 ostream 的变体。预定义对象 cout、cerr 和 clog 是此类的对象,因此可以在运行时重新分配给不同的 ostream 对象。例如,一个通常将输出发送到标准输出的程序可以被临时指示将其输出发送到磁盘文件。它还包含构造函数、析构函数和 =(assignment) 运算符函数。

我不明白,为什么这些类存在?这三个类有什么用吗?为什么后来这 3 个类从 C++98 标准中删除了?是什么原因?

另请参阅 C++ 流类层次结构。它没有这 3 个类。

C++ I/O 类层次结构

4

2 回答 2

3

他们发现有缺陷。它们被替换为:

  1. iostate rdstate()to 读取流状态。
  2. void clear(iostate state = goodbit)设置流状态。
  3. basic_streambuf<class charT, class Traits>* rdbuf()检索流缓冲区。
  4. basic_streambuf<class charT, class Traits>* rdbuf(basic_streambuf<class charT, class Traits>* sb)设置流缓冲区。
  5. basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)设置 rhs 的所有其他数据成员。
于 2015-11-28T14:17:25.567 回答
2

_withassign 类有什么问题?

一致性。由于 C++98 标准 I/O 流被认为不会被复制,因此最初通过进行相关操作private(直到 C++11),然后通过显式delete-ing 它们。

在 C++ 中处理资源的方式很重要,因为您可以决定独占或共享它,这与其他语言不同,在其他语言中您不能并且需要习惯该语言选择的一种。拥有两个版本会破坏(这是一种委婉说法)的一致性。这是违反直觉的。

此外,严格来说,*_withassign包装器不会添加iostreams 不能做的事情。


例如,一个通常将输出发送到标准输出的程序可以被临时指示将其输出发送到磁盘文件。它还包含构造函数、析构函数和 =(assignment) 运算符函数。

例如,您可以使用rdbuf获取std::basic_streambuf当前使用的流的底层并提供另一个流,该流由另一个标准流获得,或者您通过从std::basic_streambuf类继承而编写的流获得std::basic_filebuf

您所说的可以通过以下方式轻松实现:

std::ofstream ofs{path};
auto oldbuf = cout.rdbuf( ofs.rdbuf() );
于 2015-11-28T15:00:44.943 回答