【问题标题】:Why were the iostream_withassign, ostream_withassign & istream_withassign classes removed from the C++ I/O system?为什么要从 C++ I/O 系统中删除 iostream_withassign、ostream_withassign 和 istream_withassign 类?
【发布时间】:2016-03-02 12:40:44
【问题描述】:

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

iostream_withassign类的成员函数:

构造函数和析构函数

~iostream_withassign

public:virtual ~iostream_withassign()

iostream_withassign

public:iostream_withassign()

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

操作员 =

public:iostream_withassign& operator =(iostream_withassign& rhs)

赋值运算符 运算符 =

重载 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 对象。例如,一个通常将输出发送到标准输出的程序可以被临时指示将其输出发送到磁盘文件。它还包含构造函数、析构函数和 =(赋值)运算符函数。

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

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

【问题讨论】:

  • 您要解决什么问题?标准 iostream 类确实具有更改底层缓冲区的机制。使用这些有什么问题?
  • @KerrekSB:然后描述一下那个机制?它们是什么?
  • @KerrekSB:但仍然没有得到 _withassign 类有什么问题的答案?

标签: c++ iostream language-history


【解决方案1】:

_withassign 类有什么问题?

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

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

此外,严格来说,*_withassign 包装器并没有太多 iostreams 无法做到的事情。


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

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

你说的很容易实现:

std::ofstream ofs{path};
auto oldbuf = cout.rdbuf( ofs.rdbuf() );

【讨论】:

    【解决方案2】:

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

    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 的所有其他数据成员。

    【讨论】:

    • 这个答案可以通过详细说明以什么方式旧类有缺陷来改进。
    猜你喜欢
    • 2017-08-18
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    • 1970-01-01
    • 2010-09-21
    • 1970-01-01
    相关资源
    最近更新 更多