如果类型是对纯虚拟基 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;