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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AlexDavidyk
0 / 0 / 0
Регистрация: 11.10.2014
Сообщений: 3
#1

Реализация Синглетона, используя шаблоны C++ - C++

20.11.2014, 10:56. Просмотров 243. Ответов 4
Метки нет (Все метки)

В низу два Singleton, один я взял из этого форума, другой с книги, просто интересно имеют ли они одинаковый функционал. Любопытство возникло по причине того что найти объяснения в интернете я так и не смог.


Первый
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
#include <iostream>
#include <cstdlib>
#include <fstream>
 
template <typename T>
class Singleton
{
public:
    virtual ~Singleton () {};
    static T* getInstance ()
    {
        if (!singletonInstance)
        {
            singletonInstance = new T ();
        }
        return singletonInstance;
    }
    
protected:
    Singleton () {};
    static T* singletonInstance;
};
 
template <typename T>
T* Singleton<T>::singletonInstance;
 
class Logger : public Singleton <Logger>
{
private:
    Logger() : Singleton<Logger>() {}
    
protected:
    friend class Singleton<Logger>;
    
public:
    void log(const std::string& logMessage) const
    {
        std::cerr <<  logMessage << std::endl;
        
        const std::string logFile = "log.txt";
        std::ofstream f(logFile.c_str(), std::ios::app);
        f << logMessage << std::endl;
    }
};
 
int main()
{
    Logger::getInstance()->log("abc");
    return EXIT_SUCCESS;
}


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
#include <iostream>
#include <cstdlib>
#include <fstream>
#include <cassert>
 
 
template <typename T>
class Singleton
{
public:
    
    Singleton()
    {
        assert(!singletonInstance);     
        singletonInstance = static_cast<T*>(this);
    }
    ~Singleton()
    {
        assert(singletonInstance);
        singletonInstance = 0;
    };
 
public:
    static T* GetSingletonPtr() { return singletonInstance; }
    static T& GetSingleton()        { return *singletonInstance; }
    static T* singletonInstance;
};
 
template <typename T>T* Singleton<T>::singletonInstance=0;
 
class Logger : public Singleton <Logger>
{
public:
    Logger()  {}
public:
    void log(const std::string& logMessage) const
    {
        std::cerr << "logMessage" << std::endl;
        const std::string logFile = "log3.txt";
        std::ofstream f(logFile.c_str(), std::ios::app);
        f << "logMessage" << std::endl;
    }
};
 
int main()
{
    new Logger; 
    Logger *p = Logger::GetSingletonPtr();
    p->log("abc");  
    return EXIT_SUCCESS;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 10:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Реализация Синглетона, используя шаблоны C++ (C++):

Реализация списка + Шаблоны классов - C++
Всем добрый день, есть не большая проблема с реализацией списка с помощью шаблонов класса. Далеко не профи я :) Тоже самое смог сделать...

Как создать пустой прямоугольник, используя шаблоны прорисовки? - C++
Здравствуйте! Подскажете пожалуйста как нарисовать пустотелый прямоугольник,используя цикл и шаблоны прорисовки. типа *********** -...

Как создать функцию ввода элементов массива используя шаблоны? - C++
Извините, по глупому вопросу, но на данный момент я не смог сообразить сам. Как создать функцию ввода элементов массива с помощью...

Определить какое из двух чисел больше, используя шаблоны функции - C++
Напишите программу на языке программирования С++, определяющую какое из двух больше. При разработке программы используйте шаблон функции.

Написать функцию, используя шаблоны функций, организуйте ее работу с целыми и вещественными числами - C++
Написать функцию, используя шаблоны функций, организуйте ее работу с целыми и вещественными числами. Организовать ее вызов в главной...

Написать функцию используя шаблоны функций, организуйте ее работу с целыми и вещественными числами - C++
Написать функцию используя шаблоны функций, организуйте ее работу с целыми и вещественными числами. Организовать ее вызов в главной функции...

4
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 11:05 #2
небольшая разница в использовании только, а что именно Вам не понятно?
и во втором примере оч странно что указатель на инстанс публичный

Добавлено через 1 минуту
к тому же, во втором примере, при повторной попытке вызвать конструктор будет завершение программы
1
castaway
Эксперт С++
4884 / 3019 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
20.11.2014, 11:21 #3
Про второй пример вообще забудь, его делал неправильный человек.
Цитата Сообщение от aLarman Посмотреть сообщение
а что именно Вам не понятно?
1
ForEveR
В астрале
Эксперт С++
7978 / 4737 / 321
Регистрация: 24.06.2010
Сообщений: 10,543
Завершенные тесты: 3
20.11.2014, 11:27 #4
AlexDavidyk, Если используете С++11 используйте Синглтон Мейерса.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T>
class Singleton
{
public:
   Singleton(const Singleton&) = delete;
   Singleton& operator = (const Singleton&) = delete;
   static T& getInstance()
   {
       static T instance;
       return instance;
   }
private:
   Singleton() = default;
};
0
aLarman
642 / 563 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 11:30 #5
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<typename T>
class Singleton
{
public:
   static T& getInstance()
   {
       static T instance;
       return instance;
   }
private:
   Singleton(const Singleton&){};
   Singleton& operator = (const Singleton&){};
   Singleton(){};
};
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.11.2014, 11:30
Привет! Вот еще темы с ответами:

Реализация бинарного дерева, используя класс - C++
Доброго времени суток. Ниже пример бинарного дерева, с использованием структуры и двух функций: заполнением и прямым обходом: #include...

реализация разряженного одномерного массива используя динамический массив - C++
Добрый вечер! Прошу помочь написать программу,реализирующую разряженного одномерного массива используя динамический массив,а то совсем идей...

«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». - C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». Есть ли разница в этих понятиях? Если есть, то в чём? И где (в каких...

Шаблоны. Плохо понимаемые моменты из книги "Шаблоны С++. Справочник разработчика". (Вандевурд, Джосаттис) - C++
Так как изучаю эту книгу, то в некоторых местах возникают вопросы. Чтобы не плодить много тем, корни у которых одни, решил создать эту...


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

Или воспользуйтесь поиском по форуму:
5
Yandex
Объявления
20.11.2014, 11:30
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru