我承認,我也不明白。我找不到任何 默認的構造函數在所有的std::istream
,我會覺得 你想一個,如果你想要的,因爲奇怪的方式std::ios_base
作品打造的雙向流, :在 構造函數不任何初始化,但派生的 類必須在其構造函數 中明確調用std::ios_base::init
。當涉及多繼承時(即 雙向IO,其中類來自 std::istream
和std::ostream
),我期望只有最多的 派生類才能調用std::ios_base::init
。 (在 std::iostream
,std::ios_base::init
會被調用兩次。) 事實上,在標準查找它之前,我正要 答案是默認的構造函數是受保護的,因爲它 沒有叫std::ios_base::init
,並直接使用它,而不是派生類中的 ,則會導致未初始化的 流。
總之,你的直接問題有一個簡單的解決方案:
std::ostream out(NULL);
另外:你以後需要設立水槽的功能是rdbuf()
的 非const版本,而不是copyfmt()
。 rdbuf()
是用於讀取和指針設置爲streambuf
, copyfmt()
複製格式化標誌 ,但並沒有觸摸的 指針streambuf
。
所以你可以做這樣的事情:
std::ostream out(NULL);
// ...
std::filebuf fileBuffer;
if (filenameGiven) {
fileBuffer.open(filename.c_str(), std::ios_base::out);
}
if (fileIsOpen()) {
out.rdbuf(&fileBuffer);
} else {
out.rdbuf(std::cout.rdbuf());
}
(我這樣做了很多其實,我認爲這是通常的 成語的時候,你不知道前面是否輸出到文件 或std::cout
)
編輯:
而且又修正:的rdbuf
電話clear()
非const版本, 所以你不必。(我知道我這樣做沒有調用clear()
,但 當我看到init
設置badbit
...)
總之:總結是:它通常preferrable將指針傳遞到有效 streambuf來構造的std::ostream
,但如果你不能,它是 完全有效的通過一個空指針,並設置一個有效的指針後使用 rdbuf()
。而其他答案都是錯誤的。
你期待'ostream'做什麼? – Rapptz
@Rapptz表現得像'std :: cout'或'std :: cerr'?就像輸出流一樣? – user2485710
我認爲他的意思是「輸出到哪裏」。順便說一句 - cout和cerr輸出到不同的位置。他們恰好是默認情況下打印到屏幕 – rabensky