如何传递ostream对象?

时间:2014-05-31 13:29:45

标签: c++ cout ofstream ostream ampersand

我有这样的结构

struct X{
    ostream out;
    X() : out(cout) {}
    ...
};

我注意到我必须用&正确传递cout作为默认参数:ostream& out;我不知道为什么,我不知道是否有其他可能性保持ostream没有&。此外,当我尝试设置

X x;
ofstream out;
x.out = out;

编译器发现了很多错误......我希望能够将X :: out设置为cout或者设置为ofstream。怎么做?

3 个答案:

答案 0 :(得分:2)

你可能做的最好的事情就是改变你的课程设计,这样你就不再需要初始化一个成员变量了。编译器阻止了复制,基于指针的解决方案将引入所有权问题,std::shared_ptr会产生std::cout的麻烦,参考成员将创建悬挂引用的可能性。

尝试重构代码,以便在需要时始终将流作为对外部方法的引用传递:

struct X{
    X() {}
    void f(std::ostream &os);
};

答案 1 :(得分:1)

ostreams不能通过值传递。你必须通过引用或指针传递。

如果您希望能够使x.out在其生命周期内引用不同的流,则将其设为指针。否则将其作为参考。

答案 2 :(得分:0)

Stream对象无法复制,需要使用引用。

struct X{
    ostream& out;

     X() :out( std::cout ) {}

     // X( ostream& out_ = std::cout ) : out( out_ ) {}

};