der*_*khh 5 c++ iostream ostream
我正在定义一个这样的类:
class StaticRuntimeContext {
public:
enum Verbosity {
kHIGH,
kMEDIUM,
kLOW,
kSILENT
};
static void Construct();
static std::ostream& stdout1() {return stdout1_;}
static std::ostream& stdout2() {return stdout2_;}
static std::ostream& stdout3() {return stdout3_;}
static std::ostream& stderr() {return stderr_;}
protected:
private:
static std::ostream& stdout1_;
static std::ostream& stdout2_;
static std::ostream& stdout3_;
static std::ostream& stderr_;
};
Run Code Online (Sandbox Code Playgroud)
我将构造函数定义为:
void StaticRuntimeContext::Construct() {
std::ostream& test = cout;
stdout1_ = cout;
stdout2_ = cout;
//stdout3_ = NULL;
stderr_ = cerr;
}
Run Code Online (Sandbox Code Playgroud)
我无法理解为什么将cout分配给test(std :: ostream&)可以编译,但编译器会为其余部分生成错误消息,如"stdout1_ = cout".错误消息是:
/usr/lib/gcc/x86_64-redhat-linux/4.6.2/../../../../include/c++/4.6.2/bits/ios_base.h:791:5: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private
Run Code Online (Sandbox Code Playgroud)
我想知道我应该怎么做才能正确地将cout分配给这些ostream引用变量.谢谢!
这是因为引用具有值语义,而operator =正在复制对象而不是分配新的引用.
您应该定义静态指针而不是引用,在Construct中分配它们,并在访问器中返回引用
static std::ostream& stdout1() {return *stdout1_;}
static std::ostream& stdout2() {return *stdout2_;}
static std::ostream& stdout3() {return *stdout3_;}
static std::ostream& stderr() {return *stderr_;}
protected:
private:
static std::ostream* stdout1_;
static std::ostream* stdout2_;
static std::ostream* stdout3_;
static std::ostream* stderr_;
void StaticRuntimeContext::Construct() {
stdout1_ = &cout;
stdout2_ = &cout;
stdout3_ = &cout;
stderr_ = &cerr;
}
Run Code Online (Sandbox Code Playgroud)
编辑:你必须在你的.cpp文件中添加它
std::ostream* StaticRuntimeContext::stdout1_ = NULL;
std::ostream* StaticRuntimeContext::stdout2_ = NULL;
std::ostream* StaticRuntimeContext::stdout3_ = NULL;
std::ostream* StaticRuntimeContext::stderr_ = NULL;
Run Code Online (Sandbox Code Playgroud)