C++ 如何传递ostream对象?

C++ 如何传递ostream对象?,c++,cout,ofstream,ostream,ampersand,C++,Cout,Ofstream,Ostream,Ampersand,我有一个这样的结构 struct X{ ostream out; X() : out(cout) {} ... }; 我注意到我必须定义out,并将cout作为默认参数正确传递:ostream&out;我不知道为什么,我也不知道是否还有其他可能在没有&的情况下保留ostream。此外,当我试图设置 X x; ofstream out; x.out = out; 编译器发现了许多错误。。。我希望能够将X::设置为cout或流。如何执行此操作?ostreams不能按值传递

我有一个这样的结构

struct X{
    ostream out;
    X() : out(cout) {}
    ...
};
我注意到我必须定义out,并将cout作为默认参数正确传递:ostream&out;我不知道为什么,我也不知道是否还有其他可能在没有&的情况下保留ostream。此外,当我试图设置

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

编译器发现了许多错误。。。我希望能够将X::设置为cout或流。如何执行此操作?

ostreams不能按值传递。您必须通过引用或指针进行传递


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

ostreams不能按值传递。您必须通过引用或指针进行传递

struct X{
    ostream& out;

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

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

}; 

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

ostreams不能按值传递。您必须通过引用或指针进行传递

struct X{
    ostream& out;

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

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

}; 

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

ostreams不能按值传递。您必须通过引用或指针进行传递

struct X{
    ostream& out;

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

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

}; 

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

流对象无法复制,您需要使用引用

struct X{
    ostream& out;

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

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

}; 

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

struct X{
    ostream& out;

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

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

}; 

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

struct X{
    ostream& out;

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

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

}; 

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

struct X{
    ostream& out;

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

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

}; 

您可能能做的最好的事情是更改类设计,这样您就不需要再初始化成员变量了。编译器会阻止复制,基于指针的解决方案会带来所有权问题,
std::shared_ptr
会给
std::cout
带来麻烦,引用成员会创建挂起引用的可能性

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

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

您可能能做的最好的事情是更改类设计,这样您就不需要再初始化成员变量了。编译器会阻止复制,基于指针的解决方案会带来所有权问题,
std::shared_ptr
会给
std::cout
带来麻烦,引用成员会创建挂起引用的可能性

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

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

您可能能做的最好的事情是更改类设计,这样您就不需要再初始化成员变量了。编译器会阻止复制,基于指针的解决方案会带来所有权问题,
std::shared_ptr
会给
std::cout
带来麻烦,引用成员会创建挂起引用的可能性

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

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

您可能能做的最好的事情是更改类设计,这样您就不需要再初始化成员变量了。编译器会阻止复制,基于指针的解决方案会带来所有权问题,
std::shared_ptr
会给
std::cout
带来麻烦,引用成员会创建挂起引用的可能性

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

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

我想知道为什么。可以实现类似于共享ptr的复制和分配语义,不是吗?也就是说,所有副本都引用同一个fd并共享一个缓冲区,除非重新分配给。@PeterSchneider:好吧,您总是可以执行
std::shared_ptr
(这与直接执行此操作的流类有相同的问题)我想知道为什么。可以实现类似于共享ptr的复制和分配语义,不是吗?也就是说,所有副本都引用同一个fd并共享一个缓冲区,除非重新分配给。@PeterSchneider:好吧,您总是可以执行
std::shared_ptr
(这与直接执行此操作的流类有相同的问题)我想知道为什么。可以实现类似于共享ptr的复制和分配语义,不是吗?也就是说,所有副本都引用同一个fd并共享一个缓冲区,除非重新分配给。@PeterSchneider:好吧,您总是可以执行
std::shared_ptr
(这与直接执行此操作的流类有相同的问题)我想知道为什么。可以实现类似于共享ptr的复制和分配语义,不是吗?也就是说,所有副本都引用同一个fd并共享一个缓冲区,除非重新分配给。@PeterSchneider:好吧,你总是可以只做
std::shared_ptr
(这与直接做这件事的流类有相同的问题)
ostream
本质上是一个抽象基类,而且它不可复制(但可移动).
ostream
本质上是一个抽象基类,而且不可复制(但可移动)。
ostream
本质上是一个抽象基类,而且不可复制(但可移动)。
ostream
本质上是一个抽象基类,而且不可复制(但可移动)。