如果type是对纯虚拟基类的引用,则使用派生类的实例初始化静态类成员

时间:2018-11-18 17:40:27

标签: c++ static initializer static-constructor

当我尝试通过{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

1 个答案:

答案 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;