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

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

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

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

20.11.2014, 10:56. Просмотров 221. Ответов 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.11.2014, 10:56     Реализация Синглетона, используя шаблоны C++
Посмотрите здесь:

C++ шаблоны в си++
Шаблоны С++ C++
C++ Как создать пустой прямоугольник, используя шаблоны прорисовки?
C++ реализация разряженного одномерного массива используя динамический массив
C++ Используя рекурсию вивести групу даних с их индексами не используя масив
C++ Определить какое из двух чисел больше, используя шаблоны функции
C++ Реализация списка + Шаблоны классов
C++ Шаблоны
Используя рекурсию, перемножить 2 натуральных числа не используя операции умножения и иметь логарифмическую сложность C++
Как создать функцию ввода элементов массива используя шаблоны? C++
C++ Написать функцию используя шаблоны функций, организуйте ее работу с целыми и вещественными числами
C++ Написать функцию, используя шаблоны функций, организуйте ее работу с целыми и вещественными числами

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 11:05     Реализация Синглетона, используя шаблоны C++ #2
небольшая разница в использовании только, а что именно Вам не понятно?
и во втором примере оч странно что указатель на инстанс публичный

Добавлено через 1 минуту
к тому же, во втором примере, при повторной попытке вызвать конструктор будет завершение программы
castaway
Эксперт С++
4869 / 3008 / 370
Регистрация: 10.11.2010
Сообщений: 11,059
Записей в блоге: 10
Завершенные тесты: 1
20.11.2014, 11:21     Реализация Синглетона, используя шаблоны C++ #3
Про второй пример вообще забудь, его делал неправильный человек.
Цитата Сообщение от aLarman Посмотреть сообщение
а что именно Вам не понятно?
ForEveR
Модератор
Эксперт С++
 Аватар для ForEveR
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
20.11.2014, 11:27     Реализация Синглетона, используя шаблоны C++ #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;
};
aLarman
640 / 561 / 89
Регистрация: 13.12.2012
Сообщений: 2,109
20.11.2014, 11:30     Реализация Синглетона, используя шаблоны C++ #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(){};
};
Yandex
Объявления
20.11.2014, 11:30     Реализация Синглетона, используя шаблоны C++
Ответ Создать тему
Опции темы

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