[英]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.