zoukankan      html  css  js  c++  java
  • 实例构造函数单例模式

    本篇文章朋友在北京游玩的时候突然想到的...这段时间就有想写几篇关于实例构造函数的笔记,所以回家到之后就奋笔疾书的写出来发表了

        class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; };

        

    该类有如下特色:

        

    (1)它有一个指独一实例的静态指针m_pInstance,并且是私有的。

        

    (2)它有一个私有的函数,可以获得这个独一的实例,并在须要的时候创建该实例。

        

    (3)它的构造函数是私有的,这样就不能从别处创建该类的实例。

        


        下面我们对该类进行测试:

        #include <iostream> using namespace std; class CSingleton { public: static CSingleton * GetInstance(); int GetVar(); void SetVar(int other); private: CSingleton(); /* 默认的构造函数设置为私有 */ ~CSingleton(); static CSingleton *m_pInstance; int m_var; }; CSingleton::CSingleton() : m_var(20) { cout << "Singleton Constructor!" << endl; } CSingleton::~CSingleton() { cout << "Singleton Destructor!" << endl; } CSingleton* CSingleton::m_pInstance = NULL; /* 初始化为NULL */ CSingleton * CSingleton::GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton; } return m_pInstance; } int CSingleton::GetVar() { return m_var; } void CSingleton::SetVar(int other) { m_var = other; } int main() { CSingleton *ton1 = CSingleton::GetInstance(); CSingleton *ton2 = CSingleton::GetInstance(); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton1->GetVar() << endl; ton1->SetVar(150); cout << "ton1 var = " << ton1->GetVar() << endl; cout << "ton2 var = " << ton2->GetVar() << endl; return 0; }

        执行结果为:

        实例和构造函数

        我们知道,程序在结束的时候,系统会主动析构全部的全局变量。事实上,系统也会析构全部的类的静态成员变量,就像这些静态成员也是全局变量一样。利用这个特征,我们可以在C++单例模式类中定义一个这样的静态成员变量,而它的独一任务就是在析构函数中删除单例类的实例。如下面的代码中的CGarbo类(Garbo意为垃圾工人):

        #include <iostream> usng namespace std; class CSingleton { public: static CSingleton * GetInstance() { if (m_pInstance == NULL) { m_pInstance = new CSingleton(); } return m_pInstance; } private: CSingleton(){}; /* 默认的构造函数设置为私有 */ static CSingleton *m_pInstance; class CGarbo { public: CGarbo() { cout << "CGarbo Constructor!" << endl; } ~CGarbo() { if (CSingleton::m_pInstance != NULL) { delete m_pInstance; m_pInstance = NULL; cout << "CGarbo Destructor!" << endl; } } }; static CGarbo garbo; };

        每日一道理
    灯,带有一种明亮的光,每当深夜来临,是它陪伴着你,如此默默无闻。它是平凡的,外表华丽与否,那都是一样的,珍珠点缀,水晶加饰的灯它只能用以装饰,来满足人们的虚荣心,比起这,普普通通的日光灯是幸运的,因为它照明的本性没有改变,如同生活中的一部分人平平凡凡却实实在在。

        

    使用这类方法释放单例对象的方式有如下特征:

        

    (1) 在单例外部定义专有的嵌套类

        

    (2) 在单例内定义私有的专门用于释放单例对象的静态成员

        

    (3)利用程序在结束时析构全局变量的特性,选择最终的释放机会

        

    (4)使用C++单例模式的代码不须要任何操纵,不必关心对象的释放

        


        

    下面是测试样例:
    #include <iostream>
    using namespace std;
    
    class CSingleton
    {
    public:
    	static CSingleton * GetInstance();
    	int GetVar();
    	void SetVar(int other);
    private:
    	CSingleton();			/* 默认的构造函数设置为私有 */
    	~CSingleton();
    	static CSingleton *m_pInstance;
    	int m_var;
    	class CGarbo
    	{
    	public:
    		CGarbo()
    		{
    			cout << "CGarbo Constructor!" << endl;
    		}
    		~CGarbo()
    		{
    			if (CSingleton::m_pInstance != NULL)
    			{
    				delete m_pInstance;
    				m_pInstance = NULL;
    				cout << "CGarbo Destructor!" << endl;
    			}
    		}
    	};
    	static CGarbo garbo;
    };
    
    CSingleton::CGarbo CSingleton::garbo;
    
    CSingleton::CSingleton() : m_var(20)
    {
    	cout << "Singleton Constructor!" << endl;
    }
    
    CSingleton::~CSingleton()
    {
    	cout << "Singleton Destructor!" << endl;
    }
    
    CSingleton* CSingleton::m_pInstance = NULL;
    CSingleton * CSingleton::GetInstance()
    {
    	if (m_pInstance == NULL)
    	{
    		m_pInstance = new CSingleton;
    	}
    	return m_pInstance;
    }
    
    int CSingleton::GetVar()
    {
    	return m_var;
    }
    
    void CSingleton::SetVar(int other)
    {
    	m_var = other;
    }
    
    int main()
    {
    	CSingleton *ton1 = CSingleton::GetInstance();
    	CSingleton *ton2 = CSingleton::GetInstance();
    	cout << "ton1 var = " << ton1->GetVar() << endl;
    	cout << "ton2 var = " << ton1->GetVar() << endl;
    	ton1->SetVar(150);
    	cout << "ton1 var = " << ton1->GetVar() << endl;
    	cout << "ton2 var = " << ton2->GetVar() << endl;
    
    	return 0;
    }
    

    执行结果为:
    实例和构造函数

    文章结束给大家分享下程序员的一些笑话语录: Bphone之你们聊,我先走了!移动说:我在phone前加o,我叫o缝;苹果说:我在phone前i,我是i缝;微软说:我在phone前加w,我叫w缝;三星说:你们聊,我先走了!
    将来王建宙写回忆录的时候,一定要有一句“常小兵为中国移动的发展做出了不可磨灭的贡献”。

    --------------------------------- 原创文章 By 实例和构造函数 ---------------------------------

  • 相关阅读:
    图片切换的练习
    固定定位
    绝对定位
    相对定位
    全局作用域 变量声明
    3种循环语句 JS基础
    解除绑定事件 和 封装兼容性addEvent 来处理针对于不同浏览器的兼容方法
    插入排序法 猴子选大王 检索的数组 验证身份证号码 练习
    [z]JSONP例子
    ireport related
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3095754.html
Copyright © 2011-2022 走看看