单例模式(单一实例) C++版本

前端之家收集整理的这篇文章主要介绍了单例模式(单一实例) C++版本前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
C++实现的单例模式,在面试题中出现的很多,
其中主要有以下几点需要注意:
1 默认构造函数私有化
2 拷贝构造函数私有化
3 提供静态的公有函数获取单一实例(同时提供释放函数
4 声明静态的私有单一实例指针,以及在全局代码中进行初始化的工作


以下是具体的代码,实现了单线程下的单例模式,同时演示了多线程下的单一实例创建代码


  1. class CSingle
  2. {
  3. private:
  4. CSingle(); //默认构造私有化
  5. CSingle(CSingle &obj); //拷贝构造私有化
  6. static CSingle* pSingle; //私有的静态成员,用来保存单一实例的指针
  7. public:
  8. static CSingle* GetInstance(); //提供一个公有的静态函数,让外界获取单一实例对象
  9. static void ReleaseInstance(); //提供一个公有的静态函数,让外界释放单一实例对象
  10. };
  11.  
  12. CSingle* CSingle::pSingle = NULL; //对静态成员初始化,很容易被遗漏的地方
  13.  
  14. CSingle::CSingle()
  15. {
  16. }
  17.  
  18. CSingle::CSingle(CSingle &obj)
  19. {
  20. }
  21. //#define MULTI_THREAD
  22. #ifndef MULTI_THREAD
  23. CSingle* CSingle::GetInstance()//没有考虑多线程的情况,如果是多线程需要加锁
  24. {
  25. if (!pSingle)
  26. {
  27. pSingle = new CSingle;
  28. }
  29. return pSingle;
  30. }
  31. #else
  32. CSingle* CSingle::GetInstance()//多线程版本
  33. {
  34. if (pSingle)
  35. {
  36. return pSingle;
  37. }
  38. //lock 加锁 具体代码省略,windows平台可以用临界区
  39. {
  40. if (!pSingle)//进入锁之后还需要再检查一次对象是否已经创建出来,
  41. //因为多线程环境下单一实例对象可能被其他线程创建出来
  42. {
  43. pSingle = new CSingle;
  44. }
  45. }
  46. //unlock 解锁
  47. return pSingle;
  48. }
  49. #endif
  50.  
  51. void CSingle::ReleaseInstance()
  52. {
  53. if (pSingle)
  54. {
  55. delete pSingle;
  56. pSingle = NULL;
  57. }
  58. }
  59.  
  60. int _tmain(int argc,_TCHAR* argv[])
  61. {
  62. // 下面2个对象pObj1,pOjb2 的地址是一样的,也就是保证了单例模式
  63. CSingle *pObj1 = CSingle::GetInstance();
  64. CSingle *pObj2 = CSingle::GetInstance();
  65.  
  66. //CSingle a; 调用私有的*默认构造*函数被编译器检测到,报错
  67. //CSingle b(*pObj1); 调用私有的*拷贝构造*函数被编译器检测到,报错
  68.  
  69. CSingle::ReleaseInstance();
  70. return 0;
  71. }

猜你在找的设计模式相关文章