如有不明白注释可以参看 上篇中关于构造器与析构器的私有化。
#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获得的是同一个实例
本文介绍了一种通过私有化构造器与析构器确保类的唯一实例在堆上创建的方法。通过静态成员函数控制类实例的创建与销毁过程,有效避免了多次实例化与不当销毁的问题。
7327





