您的位置:首页 - 教程 - C++ - 正文
c++ 单例模式

  一般情况下,当我们建立一些工具性质的类的时候,通常不用存储太多跟自身有关的数据。在这种情况下,每次都去new一个对象,既增加了开销,也使得代码显得臃肿。其实,此时我们只需要一个实例对象就可以。

  而使用全局变量或者静态变量的方式,会影响封装性,难以保证其他代码不会对全局变量产生影响。

  考虑到这些影响,可以将默认构造函数声明为私有的,这样就不会被外部所new了,甚至可以把析构函数也设置为私有的,这样就只有我们自己可以删除自己了。 

singleton.h

 #ifndef _CSINGLETON_H_
 #define _CSINGLETON_H_
 
 class    CSingleton
 {
 public:
     static    CSingleton&    GetInstance();
     static    int init();
     void    DoSomething();//For Test
 private:
     CSingleton();
     //拷贝构造函数和"="操作符也设为私有,防止被复制
     CSingleton(const CSingleton&);
     CSingleton&    operator=(const CSingleton&);
 
     static    CSingleton    *m_pInstance;
 };
 
 #endif
View Code

singleton.cpp

 #include "Singleton.h"
 #include <assert.h>
 #include <iostream>
 using namespace std;
 
 CSingleton* CSingleton::m_pInstance = NULL;
 
 CSingleton::CSingleton()
 {
 }
 
 CSingleton::CSingleton(const CSingleton&)
 {
 }
 
 CSingleton&    CSingleton::GetInstance()
 {
     assert(NULL != m_pInstance);
     return *m_pInstance;
 }
 
 int CSingleton::init()
 {
     assert(NULL == m_pInstance);
     try
     {
         m_pInstance = new CSingleton;
 
         cout << "Succeed to init CSingleton." << endl;
         return true;
     }
     catch(...)
     {
         m_pInstance = NULL;
         return false;
     }
 }
 
 void CSingleton::DoSomething()
 {
     cout << "Succeed to do something." << endl;
 }
View Code

main.cpp

 #include <iostream>
 #include "Singleton.h"
 using namespace std;
 
 int main()
 {
     if(true != CSingleton::init())
     {
         cout << "Init CSingleton fail." << endl;
         return -1;
     }
     
     CSingleton::GetInstance().DoSomething();
 
     return 0;
 }
View Code

结果如下:


评论: