如何传递ostream对象

How to pass ostream objects?

本文关键字:对象 ostream 何传递      更新时间:2023-10-16

我有一个像这样的结构体

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_ ) {}
};