当我尝试通过{p>初始化Action.cpp
文件中的静态成员时
ILogger & Action::m_activeLogger = DefaultLogger();
编译器(C ++ 11 + Linux)说:
不能将类型为“ ILogger&”的非常量左值引用绑定到类型为ILogger的右值
如何初始化指向实例的静态成员变量?
最小示例:
我有一个接口基类(纯虚拟的)
base.h:
class ILogger {
public:
virtual ~ILogger();
virtual void write(std::string msg);
}
使用 DefaultLogger.h 作为实现的派生类(此处未显示CPP文件):
class DefaultLogger : public ILogger {
public:
~DefaultLogger();
void write(std::string msg);
}
在 Action.h 中,我使用静态成员变量并引用了基类:
class Action {
static ILogger & m_activeLogger;
// getter/setter to register another logger...
}
如何使用派生类初始化静态成员变量m_activeLogger
?
答案 0 :(得分:1)
不是通过引用存储记录器,而是使用unique_ptr
存储记录器,并为访问者取消引用:
class Action {
static std::unique_ptr<ILogger> m_activeLogger;
// getter/setter to register another logger...
}
然后应该有一个访问器来获取它:
ILogger& get_instance(){return * m_activeLogger;}
否则,您将无法设置其他记录器!至少没有参考。
旁注,虚拟调用可能应该对字符串使用const&,然后用override
标记它们:
void write(const std::string& msg) override;