• 单例类模板


    单例模式:类在系统生命周期中只有一个对象存在

    思路:将构造函数设为私有。创建一个标记,用于指示对象的个数,多于一个返回已经创建了的对象,少于一个则创建一个。

    单例类模板的实现:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    class SObject
    {
        static SObject* c_instance;  // 创建一个对象指针标记,指向GetInstance返回的对象,用于判断是否需要创建对象。    
        SObject(const SObject&);              // 将构造函数,拷贝构造函数,赋值函数全部私有化,外部无法创建对象。
        SObject& operator= (const SObject&);   
        SObject()  {  }
    public:
        static SObject* GetInstance();   // 外部函数只有通过此函数得到唯一的一个类的对象。
    {
        if(c_instance == NULL)
         {
           c_instance = new SObject(); // 在这里创建唯一一个对象
         }
    return c_intance;
       } }; SObject* SObject::c_instance = NULL; int main() { SObject* s = SObject::GetInstance(); // 三个对象地址相同,说明其是一个对象 SObject* s1 = SObject::GetInstance(); SObject* s2 = SObject::GetInstance(); cout << "addr of s" << s << endl; // 0x7fffdcb61e70 cout << "addr of s1" << s1 << endl; // 0x7fffdcb61e70 cout << "addr of s2" << s2 << endl; // 0x7fffdcb61e70
    // 并没有释放对象 ,存在于整个软件运行周期
    return 0; }

    进阶的单例类模板:

    #ifndef _SINGLETON_H_
    #define _SINGLETON_H_
    
    template
    < typename T >
    class Singleton
    {
        static T* c_instance;
    public:
        static T* GetInstance();
        {
            if( c_instance == NULL )
            {
                c_instance = new T();
            }  
            return c_instance;
        }
    };
    
    template
    < typename T >
    T* Singleton<T>::c_instance = NULL;
    
    #endif
    View Code
    #include <iostream>
    #include <string>
    #include "Singleton.h"
    
    using namespace std;
    
    class SObject
    {
        friend class Singleton<SObject>;    // Singleton是SObject的友元   自定义类SObject使用单例模式
        SObject(const SObject&);
        SObject& operator= (const SObject&);  
        SObject()  { }
    public: 
    };
    
    int main()
    {
        SObject* s = Singleton<SObject>::GetInstance();
        SObject* s1 = Singleton<SObject>::GetInstance();
        SObject* s2 = Singleton<SObject>::GetInstance();
        return 0;
    }
    View Code
  • 相关阅读:
    recorder.js 基于H5录音功能
    input type=file 怎么样调取用户手机照相机
    js replace(a,b)之替换字符串中所有指定字符的方法
    XYIXY.COM短网址在线生成,快速、稳定、永久有效,免费开放网址缩短API接口。
    NAVICAT FOR MYSQL破解版安装
    HTML之marquee(文字滚动)详解
    奇异值分解(SVD) --- 几何意义
    矩阵奇异值分解(SVD)及其应用
    行人检测(Pedestrian Detection)资源
    基金项目的英文
  • 原文地址:https://www.cnblogs.com/zsy12138/p/10863213.html
Copyright © 2020-2023  润新知