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

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

ILogger & Action::m_activeLogger = DefaultLogger();

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

не может связать неконстантную ссылку типа lvalue типа «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

Решение

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

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]