如果类型是对纯虚拟基 class 的引用,则使用派生 class 的实例初始化静态 class 成员
Initialize static class member with an instance of a derived class if type is a reference to a pure virtual base class
当我尝试通过
在我的 Action.cpp
文件中初始化静态成员时
ILogger & Action::m_activeLogger = DefaultLogger();
编译器 (C++11 + Linux) 说:
cannot bind non-const lvalue reference of type "ILogger &" to an rvalue of type ILogger
如何初始化指向实例的静态成员变量?
最小示例:
我有接口基础class(纯虚拟)
base.h:
class ILogger {
public:
virtual ~ILogger();
virtual void write(std::string msg);
}
以 DefaultLogger.h 作为派生 class 作为实现(此处未显示 CPP 文件):
class DefaultLogger : public ILogger {
public:
~DefaultLogger();
void write(std::string msg);
}
在Action.h中,我使用了一个引用基class:
的静态成员变量
class Action {
static ILogger & m_activeLogger;
// getter/setter to register another logger...
}
如何用派生的 class 初始化静态成员变量 m_activeLogger
?
不是通过引用存储您的记录器,而是使用 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;
当我尝试通过
在我的Action.cpp
文件中初始化静态成员时
ILogger & Action::m_activeLogger = DefaultLogger();
编译器 (C++11 + Linux) 说:
cannot bind non-const lvalue reference of type "ILogger &" to an rvalue of type ILogger
如何初始化指向实例的静态成员变量?
最小示例:
我有接口基础class(纯虚拟)
base.h:
class ILogger {
public:
virtual ~ILogger();
virtual void write(std::string msg);
}
以 DefaultLogger.h 作为派生 class 作为实现(此处未显示 CPP 文件):
class DefaultLogger : public ILogger {
public:
~DefaultLogger();
void write(std::string msg);
}
在Action.h中,我使用了一个引用基class:
的静态成员变量class Action {
static ILogger & m_activeLogger;
// getter/setter to register another logger...
}
如何用派生的 class 初始化静态成员变量 m_activeLogger
?
不是通过引用存储您的记录器,而是使用 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;