为什么iostream_withassign,ostream_withassign&从C ++ I / O系统中删除了istream_withassign类?

时间:2015-11-28 13:59:08

标签: c++ iostream language-history

在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对象。它不会对此对象进行任何初始化。

operator =

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

同样的方式this说:

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

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

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

C++ I/O class hierarchy

2 个答案:

答案 0 :(得分:3)

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

  1. iostate rdstate()读取流状态。
  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的所有其他数据成员。

答案 1 :(得分:1)

  

_withassign课程有什么问题?

一致性。由于C ++ 98标准I / O流被认为不被复制,因此最初通过进行相关操作private(直到C ++ 11),然后明确地delete进行复制。 / p>

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

此外,严格来说,*_withassign包装器不会添加iostream无法做到的事情。

  

例如,通常将输出发送到stdout的程序可以是   临时指示将其输出发送到磁盘文件。它也是   包含构造函数,析构函数和=(赋值)运算符函数。

您可以使用rdbuf获取当前正在使用的基础std::basic_streambuf,并提供另一个,由另一个标准流获得的或您通过继承{{1}编写的流例如,像std::basic_streambuf这样的类。

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

std::basic_filebuf