我正在使用抽象类 std::ostream。有如下引用:
std::ostream &o = std::cout;
如果满足任何条件,我需要初始化 o 以便将输出重定向到 std::cout。如果不是,输出将被重定向到文件
if (!condition)
o = file; //Not possible
如何正确编写代码?
最佳答案
或者:
std::ostream &o = condition ? std::cout : file;
或者如果您的两个代码段之间有代码:
std::ostream *op = &std::cout;
// more code here
if (!condition) {
op = &file;
}
std::ostream &o = *op;
这个问题不是特别与抽象类有关,而是无法重新设置引用。
表达式o = file
的意思不是“让o
引用file
”,而是“复制file
到 o
的 referand”。幸运的是,std::ostream
没有 operator=
,因此它无法编译并且 std::cout
没有被修改。但是考虑一下不同类型会发生什么:
#include <iostream>
int global_i = 0;
int main() {
int &o = global_i;
int file = 1;
o = file;
std::cout << global_i << "\n"; // prints 1, global_i has changed
file = 2;
std::cout << o << "\n"; // prints 1, o still refers to global_i, not file
}
关于c++ - 为什么分配给对 std::ostream 的引用无法编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6909838/