Форум программистов, компьютерный форум CyberForum.ru

Синглтон - C++

Восстановить пароль Регистрация
 
RESTY
5 / 5 / 0
Регистрация: 30.05.2012
Сообщений: 89
29.09.2013, 20:58     Синглтон #1
есть базовый класс Singleton и производный от него Logger, все вроде бы хорошо работает при создании 1 объекта, но появилась необходимость создания нескольких логов которые бы служили для конкретных целей и каждый бы писал в свой собственный файл как это реализовать вот то что сам смог:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#pragma once;
#include<iostream>
 
template<class T>
class Singleton
{
public:
    static T* instance()
    {
        if(!_instance)
            if (destroyed)
                OnDeadReference();
            else
                Create();
        return _instance;
    }
private:
    static void Create()
    {
        
        /*if(!_instance)
            _instance = new T;*/
        /*if (_refcount != MaxLogFiles)
        {*/
            static T obj;
            ++_refcount;
            _instance = &obj;
        /*}
        else
            throw std::runtime_error("Недопустимое количество объектов");*/
        
    }
    static void KillPhoenixSingleton()
    {
        _instance->~T();
    }
    static void OnDeadReference()
    {
        Create();
        new(_instance) T;
        atexit(KillPhoenixSingleton);
        destroyed = false;
    }
    static T* _instance;
    static bool destroyed;
    static int _refcount;
    static const int MaxLogFiles = 3;
protected:
    Singleton(){}
    Singleton& operator = (Singleton&);
    Singleton(const Singleton&);
    virtual ~Singleton()
    {
        std::cout << "destr_singleton_base" << std::endl;
        _instance = 0;
        destroyed = true;
    }
};
 
template<class T>
T* Singleton<T>::_instance = 0;
 
template<class T>
bool Singleton<T>::destroyed = false;
 
template<class T>
int Singleton<T>::_refcount = 0;
логгер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#pragma once;
#include"Singleton.h"
#include<fstream>
#include<iostream>
 
class Logger : public Singleton<Logger>
{
 
private:
    std::ofstream log;
 
protected:
    Logger() : Singleton<Logger>(){}
    friend class Singleton<Logger>;
    virtual ~Logger()
    {
        std::cout << "destr_Logger" << std::endl;
        log << "CLOSE_FILE" << std::endl;
        log.close();
    }
 
public:
    void open(const char* name)
    {
        log.open(name);
    }
    void write_to_log(const char* msg)
    {
        log << msg << std::endl;
    }
    
};
main
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include"Logger.h"
 
void main()
{
    /*Logger *test = Logger::instance();
    test->open("test.txt");
    test->write_to_log("Hello");*/
    Logger *test2 = Logger::instance();
    test2->open("test2.txt");
    test2->write_to_log("Hello2");
 
    std::system("pause");
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.09.2013, 20:58     Синглтон
Посмотрите здесь:

Синглтон C++
как удалить синглтон? JavaScript
Замена статического класса на объект-синглтон приводит к отказу работать C#
C# Что такое синглтон в C#?
Корзина синглтон PHP ООП
C++ Потокобезобасный синглтон
C++ Мой синглтон. Дайте рекомендации, оцените, пожалуйста
C++ Синглтон для лог файла!

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 13:45. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru