[英]Why were the iostream_withassign, ostream_withassign & istream_withassign classes removed from the C++ I/O system?
在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对象相关联。
资料来源: this 。
原路此说:
ostream_withassign类是ostream的一种变体,它允许对象分配。 预定义的对象cout,cerr和clog是此类的对象,因此可以在运行时重新分配给其他ostream对象。 例如,可以将通常将输出发送到stdout的程序临时定向,以将其输出发送到磁盘文件。 它还包含构造函数,析构函数和=(assignment)运算符函数。
我不明白,为什么这些类存在? 这3个类有什么用吗? 为什么稍后将这3个类从C ++ 98标准中删除? 是什么原因?
另请参见C ++流类层次结构。 它没有这3个类。
他们被发现不足。 它们被替换为:
iostate rdstate()
读取流状态。 void clear(iostate state = goodbit)
设置流状态。 basic_streambuf<class charT, class Traits>* rdbuf()
以检索流缓冲区。 basic_streambuf<class charT, class Traits>* rdbuf(basic_streambuf<class charT, class Traits>* sb)
设置流缓冲区。 basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)
设置basic_ios<class charT, class Traits>& copyfmt(basic_ios<class charT, class Traits>& rhs)
所有其他数据成员。 _withassign类有什么问题?
一致性。 由于认为不复制C ++ 98标准I / O流,因此首先将相关操作设为private
(直到C ++ 11),然后再显式delete
-ing它们。
在C ++中,处理资源的方式很重要,因为您可以决定专有或共享它,而在其他语言中,您不能并且需要习惯于所选择的一种语言。 两种版本都破坏了一致性(这是委婉的说法)。 这是违反直觉的。
而且,严格来说, *_withassign
包装器并不会增加iostream
无法做到的东西。
例如,可以将通常将输出发送到stdout的程序临时定向,以将其输出发送到磁盘文件。 它还包含构造函数,析构函数和=(assignment)运算符函数。
例如,您可以使用rdbuf
来获取流当前正在使用的基础std::basic_streambuf
,并提供另一个流,该流是由另一种标准流获得的,或者是您通过继承自std::basic_streambuf
类(如std::basic_filebuf
编写的。
您可以轻松实现以下目标:
std::ofstream ofs{path};
auto oldbuf = cout.rdbuf( ofs.rdbuf() );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.