一、背景
一个连接必须拥有请求接收与解析的上下文。
上下文的结构不能固定,因为服务器支持的协议很多,不同协议有不同的上下文结构,所以必须拥有一个容器保存不同的类型结构数据。
二、设计思路
目标:一个容器保存各种不同数据类型,例如:Any a; a = 10; a = string("abc");
Any 类中保存的是 holder 类(父类)的指针,当 Any 类要保存数据时,会通过子类 placeholder 来实例化一个特定的子类对象,让子类保存数据,最后 Any 类中的 holder 类指针指向子类即可。
三、举例
1、代码展示
2、代码解释
(1)总体
Any 类应该是私有成员包括:父类 holder, 子类 placeholder, 父类指针 conn(用于指向具体子类对象)。共有成员就是 Any 类自身的构造函数,拷贝构造,重载 = 和获取 Any 类存储的数据。
(2)父子类实现
这里我们使用多态来实现父子类,需要实现的函数:子类构造,获取数据类型,重新用 _val 数据生成一个子类。
子类构造:用模板初始化子类成员变量。
获取数据类型:typeid 操作符返回 type_info 对象用于获取数据类型。
克隆:用保存的数据和子类构造函数再初始化一个对象。
(3)Any 构造函数
无参构造:父类指针是 nullptr
传数据构造:用子类构造,父类中指针指向子类对象
(4)Any 拷贝构造
先判断对方是否为空,为空初始化 nullptr,不为空要调用子类克隆函数初始化,不能直接拷贝别人指针。
(5)Any 获取数据
先判断要获取的数据类型和保存的数据类型是否一致。
由于数据保存在子类对象,所以要先强转父类指针,再获取数据取地址返回。
(6)Any 重载 =
先实现一个交换函数,目的是让构造的临时对象存放的目标数据交换到 this 指向的对象。
重载的思路就是先用传过来的数据构造临时对象,然后交换彼此资源。
(7)Any 析构函数
释放父类指针。