本文共 1300 字,大约阅读时间需要 4 分钟。
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得到的是同一个实例对象,这也就实现了单例模式。
转载地址:http://rcqxi.baihongyu.com/