>[оверквотинг удален]
> wlog logs();
> В начале программы он забивается данными о логах, в которые нужно писать:
> logs.add_log("error",TO_FILE,"ERROR: ",PROGRAM_NAME,"/tmp/logfile",true);
> logs.add_log("log_12",TO_SYSLOG,"TEST",PROGRAM_NAME,"mail.debug");
> logs.add_log("debug",TO_STDERR);
> Нужно иметь возможность в любом месте программы вызвать функцию класса вида:
> logs.print("debug","opa %i",i);
> То есть класс wlog должен быть доступен везде.
> При этом делать глобальные переменные - плохой стиль.
> Подскажите, как правильнее сделать?В C++ -- синглтон Майерса:
<----------------------------------- cut here ----------------------------------->
class MySingleton
{
public:
static MySingleton &instance()
{
static MySingleton singleton;
return singleton;
}
// Other non-static member functions
private:
MySingleton() {} // Private constructor
~MySingleton() {}
MySingleton(const MySingleton &); // Prevent copy-construction
MySingleton &operator=(const MySingleton &); // Prevent assignment
};
<----------------------------------- cut here ----------------------------------->
Фичи:
- конструктор вызовется первый раз при вызове instance()
- с помощью переноса конструкторов/деструктора/оператора= в private -- добились запрета создания не-синглтона
Дальше добавляете в этот класс ваши методы и работаете через instance():
MySingleton::instance().add_log()
Если неохота каждый раз писать такую длинную строку -- можно воспользоваться #define:
#define logs MySingleton()::instance()
и обращаться так:
logs.add_log()
Это нормальный способ работы, даже в Qt применяется:
http://qt.gitorious.org/qt/qt/blobs/4.8/src/corelib/kernel/q...
И насчет потокобезопасности не забывайте:
"Отметим также, что приведенный пример не является потокобезопасным в С++03, для работы с классом из нескольких потоков нужно защитить переменную singleton от одновременного доступа, например, с помощью мьютекса или критической секции. Впрочем, в C++11 синглтон Майерса является потокобезопасным и без всяких блокировок."
Источники:
1. http://ru.wikipedia.org/wiki/%D0%9E%D0%B...
2. http://forum.sources.ru/index.php?showtopic=347051
3. http://habrahabr.ru/post/147373/