c – 我应该如何正确地将cout分配给静态ostream引用变量?
发布时间:2020-12-16 09:38:22 所属栏目:百科 来源:网络整理
导读:我正在定义一个这样的类: 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
我正在定义一个这样的类:
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_; }; 我将构造函数定义为: void StaticRuntimeContext::Construct() { std::ostream& test = cout; stdout1_ = cout; stdout2_ = cout; //stdout3_ = NULL; stderr_ = cerr; } 我无法理解为什么将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 我想知道我应该怎么做才能正确地将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; } 编辑: std::ostream* StaticRuntimeContext::stdout1_ = NULL; std::ostream* StaticRuntimeContext::stdout2_ = NULL; std::ostream* StaticRuntimeContext::stdout3_ = NULL; std::ostream* StaticRuntimeContext::stderr_ = NULL; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |