1、使用方法
我们在头文件中声明一个如下的类,定义一个指向该类自己的静态成员指针变量kpHttpClientInstance;
class CHttpClient
{
public:
CHttpClient();
~CHttpClient();
static CHttpClient* GetInstance();
int Init(const string& server_ip, const string& server_port);
private:
static CHttpClient* kpHttpClientInstance; //声明
int kStatus;
std:: string kServerHost;
std:: string kServerPort;
};
注意,static成员一定要在类外初始化!!
为什么?因为静态成员属于整个类,而不属于某个对象,如果在类内初始化,会导致每个对象都包含该静态成员,这是矛盾的。
【static数据成员在类外定义和初始化是为了保证只被定义和初始化一次,这样编译器就不必考虑类的函数里面第一个对static变量的’=’操作是赋值还是初始化了。】
接下来我们实现CHttpClient类:
//实现
CHttpClient* CHttpClient::kpHttpClientInstance= NULL; //定义和初始化,在类的外面定义,实际上是给静态成员变量分配内存。
CHttpClient::CHttpClient():kStatus(0)
{
}
CHttpClient::~CHttpClient()
{
if (NULL != kpHttpClientInstance)
{
delete kpHttpClientInstance;
kpHttpClientInstance= NULL;
}
}
CHttpClient* CHttpClient::GetInstance()
{
if (NULL == kpHttpClientInstance)
{
kpHttpClientInstance= new CHttpClient();
}
return kpHttpClientInstance;
}
int CHttpClient::Init(const string& server_ip, const string& server_port)
{
kServerHost = server_ip;
kServerPort = server_port;
return 0;
}
定义一个“本类”的静态对象(或该对象的指针或引用),这个静态成员一般是全局存在的,每个成员都可以时刻与这个特殊的类对象有关联。
实现中有一个判断语句,判断 kpHttpClientInstance是否为空,保证了只有一次实例化。而实际上,添加指向自己的静态指针成员,目的就是在整个程序运行中只实例化一次,整个程序中GetInstance得到的是同一个实例对象,这也就实现了单例模式。