1.单例模式
1.把bflag放到类中:解决bflag为外部共有变量的问题
1.改为static类型,static bool bflag,并在类外初始化。
#include <iostream>
using namespace std;
// bool bflag = false; // 在main函数中可以将其重置为false,此时就可以继续生成新的类,不满足单例的要求
class CPerson
{
private:
static bool bflag;
private:
CPerson(){
}
~CPerson(){
}
public:
static CPerson* GetObject()
{
if(bflag == false)
{
bflag = true;
CPerson *p = new CPerson;
return p;
}
return NULL;
}
};
bool CPerson::bflag = false;
int main()
{
CPerson *ps1 = CPerson::GetObject();
// bflag = false; // 此时更改bflag的值就可以重新生成一个对象,故需将bflag变为类成员
CPerson *ps2 = CPerson::GetObject();
system("pause");
return 0;
}
2.删除单例后想重新生成一个单例,则在析构函数中进行bflag的更改,该析构是私有的,提供一个DestroyObject接口函数去调用析构函数。
#include <iostream>
using namespace std;
class CPerson
{
private:
static bool bflag; // 程序中是否存在对象
private:
CPerson()
{
}
~CPerson()
{
}
public:
CPerson(const CPerson& pp)
{
}
public:
static CPerson* GetObject()
{
if(bflag == false)
{
CPerson* p = new CPerson;
bflag = true;
return p;
}
return NULL;
}
static void DestoryObject(CPerson* pObject)
{
bflag = false;
delete pObject;
}
};
bool CPerson::bflag = false;
int main()
{
CPerson* p = CPerson::GetObject();
CPerson* ps = new CPerson(*p);
system("pause");
return 0;
}
3.经过上述步骤之后,通过拷贝构造仍可创建一个新对象,因此需要将拷贝构造也设计为私有。
#include <iostream>
using namespace std;
class CPerson
{
private:
static bool bflag;
private:
CPerson(){
}
~CPerson(){
}
CPerson(const CPerson& ps){
} // 为了解决可以通过CPerson *ps2 = new CPerson(*ps1);生成新的对象的问题,需要将拷贝构造也设置为private
public:
static CPerson* GetObject()
{
if(bflag == false)
{
bflag = true;
CPerson *p = new CPerson;
return p;
}
return NULL;
}
};
bool CPerson::bflag = false;
int main()
{
CPerson *ps1 = CPerson::GetObject();
CPerson *ps2 = new CPerson(*ps1);
system("pause");
return 0;
}
2.不允许 A a 生成对象,只允许 new A 生成对象。
考虑:A a生成的对象是系统调用析构函数,即析构函数是公有的,因此将析构函数设置为private即可。
#include <iostream>
using namespace std;
class AA
{
public:
AA(){