代码之家  ›  专栏  ›  技术社区  ›  R Yoda

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

  •  -1
  • R Yoda  · 技术社区  · 7 年前

    Action.cpp 文件通过

    ILogger & Action::m_activeLogger = DefaultLogger();
    

    编译器(C++11+Linux)说:

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

    最简单的例子:

    我有一个接口基类(纯虚拟)

    基础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);
    }
    

    行动.h 我正在使用一个静态成员变量来引用基类:

    class Action {
        static ILogger & m_activeLogger;
        // getter/setter to register another logger...
    }
    

    m_activeLogger

    1 回复  |  直到 7 年前
        1
  •  1
  •   Matthieu Brucher    7 年前

    不通过引用存储记录器,而是使用 unique_ptr

    class Action {
        static std::unique_ptr<ILogger> m_activeLogger;
        // getter/setter to register another logger...
    }
    

    然后应该有一个访问器来获取它:

    ILogger& get_instance(){return * m_activeLogger;}
    

    否则,您将无法设置其他记录器!至少没有参考资料。

    另请注意,虚拟呼叫可能需要一个常量&添加到字符串,然后用 override :

    void write(const std::string& msg) override;