我承认我也看不懂。我根本找不到任何默认构造函数,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()
,而不是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()
,所以你不必这样做。(我知道我没有打电话就做到了clear()
,但是当我看到init
那套badbit
...)
无论如何:总结是:通常最好将指向有效流缓冲区的指针传递给 的构造函数std::ostream
,但如果不能,则传递空指针是完全有效的,然后使用
rdbuf()
. 否则的答案是完全错误的。