今天写了一个单例模式的实现。代码如下:
#include <iostream>
using namespace std;
//define CSingleton class
class CSingleton
{
private:
static CSingleton *m_pinstance;
CSingleton()
{
//m_pinstance=new CSingleton;//该类型语句为严重错误,自己的构造函数new自己,将陷入死循环
cout<<"CSingleton constructor"<<endl;
m_n=0;//用于测试
}
class CGarbo// 它的唯一工作就是在析构函数中删除 CSingleton 的实例
{
public:
~CGarbo()
{
if(CSingleton::m_pInstance)
delete CSingleton::m_pInstance;
}
};
static CGabor Garbo; // 定义一个静态成员,程序结束时,系统会自动调用它的析构函数
public:
int m_n;
static CSingleton *Getinstance()
{
if(NULL==m_pinstance) m_pinstance = new CSingleton;
return m_pinstance;//如果是第一次进入该函数,m_pinstance将被赋予new后的新指针,否则都是和第一次时同一个值
}
//以下为错误的析构函数,将出现自己析构自己的类型,陷入死循环
virtual ~CSingleton()
{
if(NULL!=m_pinstance)
{
cout<<"destructor CSingleton"<<endl;
delete m_pinstance; //此处严重错误,因为m_pinstance为指向CSingleton类型对象的指针
}
}
};
CSingleton* CSingleton::m_pinstance=NULL;
//CGabor CSingleton::Garbo=;
void main()
{
CSingleton *s1=CSingleton::Getinstance();
cout<<s1->m_n<<endl;
s1->m_n=100;
CSingleton *s2=CSingleton::Getinstance();
cout<<s2->m_n<<endl;//若此处输出100则证明s1和s2指向同一个实例
}
几个注意的地方:
1、定义了一个私有的静态对象指针:static CSingleton *m_pinstance,目的是为了使其指向唯一的实例对象(该类类型指针),并可以从它判断出是否已经有实例对象(静态),并防止其他地方滥用(私有);
2、定义了一个私有的构造函数,防止外部调用以构造多个对象;
3、定义了一个公有静态函数,并返回CSingleton类型的指针,可以获取这个唯一的实例(返回值),并根据判断私有静态指针的值创建该实例(内部new,调用私有构造函数),而且该函数必须为静态,否则在外部无法调用它;
4、特别注意:在该类的构造函数和析构函数中,不可以出现自己的构造函数里面出现new自己或者析构函数中出现delete自己类型的指针的情况,否则出现死循环。