我的单例模式(待修改)

来源:互联网 发布:男生宿舍捅死同学知乎 编辑:程序博客网 时间:2024/05/16 09:36

今天写了一个单例模式的实现。代码如下:

 #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自己类型的指针的情况,否则出现死循环。

原创粉丝点击