簡體   English   中英

為什么從C ++ I / O系統中刪除iostream_withassign,ostream_withassign和istream_withassign類?

[英]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_withassignistream_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個類。

C ++ I / O類層次結構

他們被發現不足。 它們被替換為:

  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)設置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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM