Важно: не поймите это неправильно, но вы делаете некоторые ошибки, которые показывают, что вы не очень опытны, а синглтоны очень трудно использовать должным образом.В случае с логгером они в порядке, просто убедитесь, что всегда используете их в качестве крайней меры.
У меня нет времени, чтобы разобраться, почему operator<<
не работает для вас, новот несколько советов о том, как улучшить ваш синглтон (вы также, кажется, просите совета по этому поводу).
Функция экземпляра
// The idiomatic way is to call this function 'Instance',
// but this doesn't really matter.
static Log& Instance() {
static Log obj;
return obj;
}
Это называется синглтоном Мейера,Для однопоточного приложения это здорово: экземпляр создается при первом вызове функции, а автоматически уничтожается при закрытии приложения (вам не нужна функция kill
).
Ваш личный виртуальный деструктор
Я заметил, что у вас есть личный виртуальный деструктор.Вам нужен только виртуальный деструктор, когда в классе есть хотя бы одна другая виртуальная функция.Это не вариант;сделать деструктор не виртуальным.
принудительное использование одного экземпляра
Вы сделали конструктор частным - это хорошо, вы не позволяете мне напрямую создавать несколько экземпляров одиночного файла,Однако вы не помешали мне сделать копии существующего синглтона.Чтобы также предотвратить это, вам также нужно сделать CopyConstructor и AssignmentOperator закрытыми:
protected:
Log();
Log(const Log&); // CopyConstructor
Log& operator=(const Log&); // AssignmentOperator
~Log();
(деструктор также должен быть закрытым, чтобы я не мог удалить единственный экземпляр класса.)
Также обратите внимание, что я сделал их protected
, а не public
.Если вы не знаете разницу, посмотрите на нее (недостаточно места для объяснения здесь).Я сделал их protected
, чтобы вы могли наследовать от Log
класса, если вам нужно.