Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Синглтон C++

  • Автор темы Автор темы P45H3
  • Дата начала Дата начала
В игре Source SDK
Забаненный
Забаненный
Статус
Оффлайн
Регистрация
10 Янв 2017
Сообщения
2,188
Реакции
806
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Коротенький гайд посвящённый
синглотонам.

Синглтон позволяет создать единственную сущность
одного типа.

Опишем класс - синглтон.
CSettingsClass.h
Код:
Expand Collapse Copy
#include <Windows.h>
class CSettingsClass {
private:
    CSettingsClass() { }
    ~CSettingsClass() { }
public:
    
    static CSettingsClass*getInstance() {
        static CSettingsClass singl;
        return &singl;
    }
//полезная нагрузка
    void Method();
    void Method1();
};

CSettingsClass.cpp
Код:
Expand Collapse Copy
#include "CSettingsClass.h"

void CSettingsClass::Method(){
printf_s("Method() was called");
}

void CSettingsClass::Method1()
{
}
Использование​
Код:
Expand Collapse Copy
#include "CSettingsClass.h"
int main(){
CSettingsClass::GetInstance()->Method();
return 0L;
}
Такую реализацию удобно использовать для
класса настроек.​
 
это немного не то, что ты в заголовке указал))
Singleton обычно используют для разруливания создания объектов на старте. Получается своеобразная обвязка для создания объекта класса.
Код:
Expand Collapse Copy
template <typename T>
    class Singleton
    {
public:
    static T* Instance()
    {
        if (nullptr == m_object)
            m_object = new Singleton(); 
        return m_object;
    }
 
    static void Release()
    {
        if (nullptr != m_object)
        {
            delete m_object;
            m_object = nullptr;
        }
    }
 
private:
    Singleton() {}
    virtual ~Singleton() {}
    Singleton(const Singleton&) { }
 
    Singleton& operator=(const Singleton&) { return *this; }
 
    static Singleton* m_object;
};
 
Singleton* Singleton::m_object = nullptr;


class YouClass : public Singleton<YouClass>
{
        friend class Singleton<YouClass>;
    public:   
    YouClass();
    void Test()
    {
        std::cout << "Singleton::Test" <<std::endl;
    }
};

//Get
auto m_ptr = YouClass::Instance();
     m_ptr->Test();

так как-то)
 
это немного не то, что ты в заголовке указал))
Singleton обычно используют для разруливания создания объектов на старте. Получается своеобразная обвязка для создания объекта класса.
Код:
Expand Collapse Copy
template <typename T>
    class Singleton
    {
public:
    static T* Instance()
    {
        if (nullptr == m_object)
            m_object = new Singleton();
        return m_object;
    }
 
    static void Release()
    {
        if (nullptr != m_object)
        {
            delete m_object;
            m_object = nullptr;
        }
    }
 
private:
    Singleton() {}
    virtual ~Singleton() {}
    Singleton(const Singleton&) { }
 
    Singleton& operator=(const Singleton&) { return *this; }
 
    static Singleton* m_object;
};
 
Singleton* Singleton::m_object = nullptr;


class YouClass : public Singleton<YouClass>
{
        friend class Singleton<YouClass>;
    public:  
    YouClass();
    void Test()
    {
        std::cout << "Singleton::Test" <<std::endl;
    }
};

//Get
auto m_ptr = YouClass::Instance();
     m_ptr->Test();

так как-то)
Ты специально каждый его коммент исправляешь ? :CoolStoryBob:
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Ты специально каждый его коммент исправляешь ? :CoolStoryBob:
Я учусь на этом. Бывает то что я не знаю спрашиваю у него.
 
это немного не то, что ты в заголовке указал))
Singleton обычно используют для разруливания создания объектов на старте. Получается своеобразная обвязка для создания объекта класса.
Код:
Expand Collapse Copy
template <typename T>
    class Singleton
    {
public:
    static T* Instance()
    {
        if (nullptr == m_object)
            m_object = new Singleton();
        return m_object;
    }
 
    static void Release()
    {
        if (nullptr != m_object)
        {
            delete m_object;
            m_object = nullptr;
        }
    }
 
private:
    Singleton() {}
    virtual ~Singleton() {}
    Singleton(const Singleton&) { }
 
    Singleton& operator=(const Singleton&) { return *this; }
 
    static Singleton* m_object;
};
 
Singleton* Singleton::m_object = nullptr;


class YouClass : public Singleton<YouClass>
{
        friend class Singleton<YouClass>;
    public:  
    YouClass();
    void Test()
    {
        std::cout << "Singleton::Test" <<std::endl;
    }
};

//Get
auto m_ptr = YouClass::Instance();
     m_ptr->Test();

так как-то)
Я не понял по поводу виртуального дескриптора
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Коротенький гайд посвящённый
синглотонам.

Синглтон позволяет создать единственную сущность
одного типа.

Опишем класс - синглтон.
CSettingsClass.h
Код:
Expand Collapse Copy
#include <Windows.h>
class CSettingsClass {
private:
    CSettingsClass() { }
    ~CSettingsClass() { }
public:
   
    static CSettingsClass*getInstance() {
        static CSettingsClass singl;
        return &singl;
    }
//полезная нагрузка
    void Method();
    void Method1();
};

CSettingsClass.cpp
Код:
Expand Collapse Copy
#include "CSettingsClass.h"

void CSettingsClass::Method(){
printf_s("Method() was called");
}

void CSettingsClass::Method1()
{
}
Использование​
Код:
Expand Collapse Copy
#include "CSettingsClass.h"
int main(){
CSettingsClass::GetInstance()->Method();
return 0L;
}
Такую реализацию удобно использовать для
класса настроек.​
Рассказал бы еще чем полезен синглтон и в каких случаях его удобно юзать)
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Код:
Expand Collapse Copy
nullptr == m_object
в чем смысл так писать ?
Python:
Expand Collapse Copy
!m_object
же короче.

да и когда читаешь код обычно смотришь на начало строки и ожидаешь увидеть там что то полезное, а там nullptr.
 
в чем смысл так писать ?
смысл в привычке, хотя на конечный результат это не влияет) Компилятор все равно сведет все к одному.
смотришь на начало строки и ожидаешь увидеть там что то полезное, а там nullptr.
надо на всю строку смотреть)))
 
Назад
Сверху Снизу