Инициализируйте член статического класса экземпляром производного класса, если тип является ссылкой на чисто виртуальный базовый класс - PullRequest
0 голосов
/ 18 ноября 2018

Когда я пытаюсь инициализировать статический член в моем файле Action.cpp через

ILogger & Action::m_activeLogger = DefaultLogger();

компилятор (C ++ 11 + Linux) говорит:

не может привязать неконстантную ссылку lvalue типа "ILogger &" к r-значению типа 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 голосов
/ 18 ноября 2018

Храните свой регистратор не по ссылке, а с 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;
...