The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Как определить общедоступный класс в C++"
Вариант для распечатки  
Пред. тема | След. тема 
Форум Программирование под UNIX (C/C++)
Изначальное сообщение [ Отслеживать ]

"Как определить общедоступный класс в C++"  +/
Сообщение от Slava (??) on 07-Май-13, 15:36 
Есть некий класс для ведения логов.
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ообщить модератору

Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Как определить общедоступный класс в C++"  +/
Сообщение от parad (ok) on 07-Май-13, 17:16 
синглтон.
Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

2. "Как определить общедоступный класс в C++"  +/
Сообщение от Mr. Mistoffelees email on 07-Май-13, 17:22 
Привет,

> Подскажите, как правильнее сделать?

По теории вам нужен public static class. Не уверен, что в C++ именно так и называется, но public позволяет вам вызвать класс из любого другого класса (того же пакета), а static - вызвать метод класса без создания отдельной инстации оного.

WWell,


Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

3. "Как определить общедоступный класс в C++"  +/
Сообщение от parad (ok) on 07-Май-13, 17:48 
не слушай его.
Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

5. "Как определить общедоступный класс в C++"  +/
Сообщение от skb7 (ok) on 19-Май-13, 04:23 
> Привет,
>> Подскажите, как правильнее сделать?
> По теории вам нужен public static class. Не уверен, что в C++
> именно так и называется, но public позволяет вам вызвать класс из
> любого другого класса (того же пакета), а static - вызвать метод
> класса без создания отдельной инстации оного.
> WWell,

В C++ всё по-другому, не стоит сравнивать два настолько разных языка как C++ и Java только потому, что некоторые ключевые слова перенесли из C++ в Java.

Ответить | Правка | ^ к родителю #2 | Наверх | Cообщить модератору

4. "Как определить общедоступный класс в C++"  +/
Сообщение от skb7 (ok) on 19-Май-13, 04:21 
>[оверквотинг удален]
> 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/

Ответить | Правка | ^ к родителю #0 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру