- 首先,单实例类要实现的目的是:在全局上某个类的对象有且只有一个,且所有对该类的访问都是指向同一个对象,如下:
WinCtl *winctl = WinCtl::getInstance();
winctl->winJump(); - 因此这个类不能被外界多次实例化(创建多个对象),即其构造函数不能被多次调用,所以将其构造函数限制为private或者protected,使外界无法直接访问;
-
class WinCtl
{
public:
private:
WinCtl();
}; - 但我们限制的是外界对其构造函数的访问,而不是对其成员(属性,函数)的访问,毕竟这个类至少要被实例化一次(当然最多也是一次)。所以我们需要定义一个public的函数getInstance()为外界提供访问;
class WinCtl
{
public:
WinCtl *getInstance();
private:
WinCtl();
}; - 这个函数返回的是该类的一个指针,为了保证这个指针指向的是同一个对象,所以我们可以将这个函数添加static限制,并且在private里定义一个static的该类指针p;
class WinCtl
{
public:
static WinCtl *getInstance();
private:
WinCtl();
static WinCtl *p;
}; - 最终,getInstance()每次返回的都是这个对象指针p,达成我们的目的,实现单实例的效果。具体函数实现如下:
WinCtl* WinCtl::p = NULL;
WinCtl::WinCtl()
{
}
WinCtl *WinCtl::getInstance()
{
if(p == NULL)
{
p = new WinCtl();
}
return p;
} 学习心得,个人理解,如有错漏,恳请指教~
|