如何传递ostream对象
How to pass ostream objects?
我有一个像这样的结构体
struct X{
ostream out;
X() : out(cout) {}
...
};
,我注意到我必须用&要正确传递cout作为默认参数:ostream &out;我不知道为什么,也不知道如果没有&此外,当我尝试设置
时X x;
ofstream out;
x.out = out;
编译器发现许多错误…我希望能够将X::out设置为out或ofstream。怎么做呢?
您可以做的最好的事情可能是更改您的类设计,以便您不再需要初始化成员变量。编译器禁止复制,基于指针的解决方案会引入所有权问题,std::shared_ptr
会给std::cout
带来麻烦,引用成员会产生悬空引用的可能性。
尝试重构您的代码,以便在需要时始终将流作为外部方法的引用传递:
struct X{
X() {}
void f(std::ostream &os);
};
ostreams不能按值传递。必须通过引用或指针传递。
如果你想让x.out
在它的生命周期中引用不同的流,那么让它成为一个指针。
流对象不能复制,需要使用引用。
struct X{
ostream& out;
X() :out( std::cout ) {}
// X( ostream& out_ = std::cout ) : out( out_ ) {}
};
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- CMake-按正确顺序将项目与C运行时对象文件链接
- 空基优化子对象的地址
- 为什么常量词在重载运算符中不与 ostream 对象一起使用<<?
- 为什么重载运算符上的异常说明符'<<'不适用于任何 std::ostream 对象,但对库中定义的运算符不起作用?
- C++ ostream 从对象数组返回数据
- 如何跟踪写入std :: Ostream对象的字节数
- 使用 std::ostream 方法将格式化文本输出到 std::string 对象
- 如何获取您放入 ostream 对象中的最后一个字符
- 检查是否已写入给定的 ostream 对象
- 使用指针数组中的对象调用重载的友元 ostream 插入运算符将返回内存地址
- 重载 std::ostream 运算符<<未调用,stream 获取变量地址而不是对象
- 使用boost::python时,将python.io对象转换为std::ostream
- 对象文件中的ostream操作符发生了什么?
- 为什么即使我没有使用 ostream 对象,ostream 的 put 指针也会被修改
- 如何传递ostream对象
- 我可以使用FILE*来初始化c++ ostream对象吗?
- 关于临时ostream对象的c++问题
- 子对象的Ostream获取父对象的Ostream