博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++类里面定义一个指向自己的静态成员指针变量(实现单例)
阅读量:4165 次
发布时间:2019-05-26

本文共 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/

你可能感兴趣的文章
闪存文件系统(Flash File System)
查看>>
WinMIPS64工具进行MIPS指令集实验(一)
查看>>
WinMIPS64工具进行MIPS指令集实验(二)
查看>>
Linux上快速入门英特尔Optane DC Persistent Memory Module的配置与使用
查看>>
Intel Optane DC Persistent Memory Module (PMM)详解
查看>>
Ubuntu 18.04安装英特尔Optane DC Persistent Memory Module配置工具ipmctl
查看>>
NUMA架构下的CPU拓扑结构
查看>>
如何判断变量在内存中如何放置的?低位在前还是高位在前
查看>>
c语言中通过指针将数值赋值到制定内存地址
查看>>
64位与32位linux c开发时默认字节对齐值
查看>>
malloc(malloc在32位编译系统中分配的地址会8字节对齐,64为编译系统中会8或者16字节对齐)
查看>>
初始化时共享内存的key值和信号量初始化的key值可以一样
查看>>
linux创建线程之pthread_create
查看>>
pthread_attr_init线程通俗举例讲解与线程属性
查看>>
进程和线程的区别
查看>>
int main(int argc,char* argv[])详解,以及与int main()有什么区别
查看>>
SourceInsight全工程查找替换方法
查看>>
C语言chdir()函数:改变当前的工作目录
查看>>
Linux下的函数执行时间的统计方法(测试某个函数的执行时间)
查看>>
调整内核printk的打印级别(启动脚本中运行 echo 0 4 0 7 > /proc/sys/kernel/printk 关闭所有内核打印)
查看>>