如有不明白注释可以参看 上篇中关于构造器与析构器的私有化。
#include <iostream>
using namespace std;
class OnlyHeapClass
{
public:
/*构造器被私有化以后,只能过接口调用构造器,但是调用接口的前提是有对象,故只能声明为
static*/
static OnlyHeapClass* GetInstance();
/*为了实现共享,不能在栈上实例化而在堆上实话化,故将析构器私有化。不能通过 delete来
销毁对象,故要通过我接口来调用析构器。
*/
void Destroy();
private:
OnlyHeapClass() {} //保证对象只能通过对接口实例化。还可阻止派生
~OnlyHeapClass(){} //保证对象只能在堆上实例化,并且只能通过接口销毁。
//对象实例化以前,static函数可用的变量也为static
static OnlyHeapClass * instance;
};
OnlyHeapClass * OnlyHeapClass::instance = NULL;
OnlyHeapClass* OnlyHeapClass::GetInstance()
{
if(NULL == instance)
{
instance = new OnlyHeapClass;
}
return instance;
}
void OnlyHeapClass::Destroy() //只有一次实例化,故只有一次销毁, 防止多次销毁
{//也可以实现为静态函数
if(instance != NULL)
{
delete instance;
instance = NULL;
}
}
int main()
{
OnlyHeapClass *p = OnlyHeapClass::GetInstance();
OnlyHeapClass *p1 = OnlyHeapClass::GetInstance();
if(p == p1)
{
cout<<"p和p1获得的是同一个实例 "<<endl;
}
p->Destroy();
p->Destroy();//多次销毁,亦不会出现,多次释放的bug
return 0;
}
--------------------打印输出------------------------
p和p1获得的是同一个实例