Когда я пытаюсь инициализировать статический член в моем 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
с моим производным классом?
Храните свой регистратор не по ссылке, а с 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;
Других решений пока нет …