如何将"cout"分配给 ostream 类的另一个对象?



我的代码

std::ostream a = std::cout; 

引发以下错误:

"std::basic_ostream<_CharT, _Traits>
::basic_ostream(const std::basic_ostream<_CharT, _Traits> &) 
[with _CharT=char, _Traits=std::char_traits<char>]" 
(declared at line 404 of "/usr/include/c++/11/ostream") is inaccessible

如何将其更改为std::ostream& a = std::cout;

您不能重新分配整个流,但可以使用rdbuf()交换底层缓冲区

#include <sstream>
#include <iostream>
std::ostringstream alternative; // get an alternative stream
std::streambuf* original = std::cout.rdbuf();  // remember the original cout buffer
std::cout.rdbuf(alternative.rdbuf()); // replace cout buffer with string buffer
doSomething();
std::cout.rdbuf(original); // restore original buffer

在线试用[Godbolt]

如果我查看了我的水晶球,我想你可能试图引用一个ostream,它可能是std::cout,也可能是一个实际的文件ofstream对象。在这种情况下,您可以在做出决策时使用指针作为中介。

int main(){
// default is std::cout
std::ostream* os = &std::cout;
if(do_i_want_os_as_a_file){
// mind the lifetime of this object if you care.
os = new std::ofstream(FILENAME); 
}
std::ostream& out = *os;
// your outputs are now
out << "Hello theren";
}

我认为这比交换底层缓冲区更整洁/更清晰。

最新更新