c++ 单例模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c++ 单例模式相关的知识,希望对你有一定的参考价值。
一般情况下,当我们建立一些工具性质的类的时候,通常不用存储太多跟自身有关的数据。在这种情况下,每次都去new一个对象,既增加了开销,也使得代码显得臃肿。其实,此时我们只需要一个实例对象就可以。
而使用全局变量或者静态变量的方式,会影响封装性,难以保证其他代码不会对全局变量产生影响。
考虑到这些影响,可以将默认构造函数声明为私有的,这样就不会被外部所new了,甚至可以把析构函数也设置为私有的,这样就只有我们自己可以删除自己了。
singleton.h
1 #ifndef _CSINGLETON_H_ 2 #define _CSINGLETON_H_ 3 4 class CSingleton 5 { 6 public: 7 static CSingleton& GetInstance(); 8 static int init(); 9 void DoSomething();//For Test 10 private: 11 CSingleton(); 12 //拷贝构造函数和"="操作符也设为私有,防止被复制 13 CSingleton(const CSingleton&); 14 CSingleton& operator=(const CSingleton&); 15 16 static CSingleton *m_pInstance; 17 }; 18 19 #endif
singleton.cpp
1 #include "Singleton.h" 2 #include <assert.h> 3 #include <iostream> 4 using namespace std; 5 6 CSingleton* CSingleton::m_pInstance = NULL; 7 8 CSingleton::CSingleton() 9 { 10 } 11 12 CSingleton::CSingleton(const CSingleton&) 13 { 14 } 15 16 CSingleton& CSingleton::GetInstance() 17 { 18 assert(NULL != m_pInstance); 19 return *m_pInstance; 20 } 21 22 int CSingleton::init() 23 { 24 assert(NULL == m_pInstance); 25 try 26 { 27 m_pInstance = new CSingleton; 28 29 cout << "Succeed to init CSingleton." << endl; 30 return true; 31 } 32 catch(...) 33 { 34 m_pInstance = NULL; 35 return false; 36 } 37 } 38 39 void CSingleton::DoSomething() 40 { 41 cout << "Succeed to do something." << endl; 42 }
main.cpp
1 #include <iostream> 2 #include "Singleton.h" 3 using namespace std; 4 5 int main() 6 { 7 if(true != CSingleton::init()) 8 { 9 cout << "Init CSingleton fail." << endl; 10 return -1; 11 } 12 13 CSingleton::GetInstance().DoSomething(); 14 15 return 0; 16 }
结果如下:
以上是关于c++ 单例模式的主要内容,如果未能解决你的问题,请参考以下文章