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

C++ 如果类型是对纯虚拟基类的引用,则使用派生类的实例初始化静态类成员,c++,static,initializer,static-constructor,C++,Static,Initializer,Static Constructor,当我尝试通过初始化Action.cpp文件中的静态成员时 编译器C++11+Linux说: 无法将ILogger类型的非常量左值引用绑定到ILogger类型的右值 如何初始化指向实例的静态成员变量 最简单的例子: 我有一个接口基类纯虚拟 基础h: 将DefaultLogger.h作为派生类作为实现CPP文件,此处未显示: class DefaultLogger : public ILogger { public: ~DefaultLogger(); void write(std:

当我尝试通过初始化Action.cpp文件中的静态成员时

编译器C++11+Linux说:

无法将ILogger类型的非常量左值引用绑定到ILogger类型的右值

如何初始化指向实例的静态成员变量

最简单的例子:

我有一个接口基类纯虚拟

基础h:

将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?

不通过引用存储日志,而是使用唯一的\u ptr存储日志,并为访问者取消引用它:

class Action {
    static std::unique_ptr<ILogger> m_activeLogger;
    // getter/setter to register another logger...
}
否则,您将无法设置其他记录器!至少没有参考资料

请注意,虚拟调用可能会对字符串执行常量(&T),然后用override标记它们:


这可能是你想要的?感谢您的宝贵回复,我花了一些时间阅读了背景文档!独特的ptr似乎起了作用。我只是在理解get_instance方法背后的思想时遇到了一些问题。为什么要返回指向唯一_ptr`的指针并将其解释为ILogger?它能代替吸气剂和塞特吗?我会添加这个setter:void setLoggerstd:unqie_ptr newlogger,它需要move来传递参数……是的,setLogger将通过more获得唯一的_ptr。然后,我不是为get实例返回指向唯一的\u ptr的指针,而是向记录器返回一个ref。为了让其他读者理解get\u实例背后的思想:*重载并返回原始指针,如get。不返回唯一的\u ptr是可以的,因为所有权没有移动,并且唯一的\u ptr只保证自由删除基础对象,而不是解决悬空指针。
class Action {
    static ILogger & m_activeLogger;
    // getter/setter to register another logger...
}
class Action {
    static std::unique_ptr<ILogger> m_activeLogger;
    // getter/setter to register another logger...
}
ILogger& get_instance(){return * m_activeLogger;}
void write(const std::string& msg) override;