【问题标题】:Initialize static class member with an instance of a derived class if type is a reference to a pure virtual base class如果类型是对纯虚拟基类的引用,则使用派生类的实例初始化静态类成员
【发布时间】:2019-04-21 04:04:52
【问题描述】:

当我尝试在我的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

【问题讨论】:

标签: c++ static initializer static-constructor


【解决方案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;

【讨论】:

  • 感谢您非常宝贵的回复,我花了一些时间阅读背景文档! unique_ptr 似乎有效。我只是难以理解 get_instance method. Why returning a pointer to an unique_ptr` 背后的想法并将其解释为 ILogger?它应该替换getter setter吗?我会添加这个设置器:void setLogger(std:unqie_ptr&lt;ILogger&gt; newlogger)(需要move() 来传递参数)...
  • 是的,setLogger 会通过 more 获得一个 unique_ptr。然后我不会返回指向 get 实例的 unique_ptr 的指针,而是将 ref 返回给记录器。
  • 为了让其他读者理解get_instance背后的想法:*被重载并返回原始指针(如get())。不返回 unique_ptr 是可以的,因为所有权不会移动,unique_ptr 只保证“释放”(删除)底层对象,但旨在解决悬空指针。
猜你喜欢
  • 2023-03-23
  • 1970-01-01
  • 2021-09-24
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2015-06-19
  • 1970-01-01
相关资源
最近更新 更多