本文主要介绍一下如何使用 c++ 设计成员变量可动态调整的抽象动态类结构。首先介绍一下项目中以前使用的一种类结构:静态类结构
1. 静态类结构
很多时候,在项目开发中设计类结构时,我们往往有一种简单、直接的惯性思维:原始数据是什么样子,设计中类成员就包含相应的成员变量,这样的类我把它称之为静态类结构。静态类结构有两个特点。
1.1 特点一:类结构抽象能力不足。
静态类结构强依赖于原始数据,是针对具体编程而不是针对抽象编程。一旦原始资源新增或者删除字段,类结构就要相应的调整类成员变量,费事费力,而且是重复机械的无技术含量的劳动。例如:影视资源 video.json,其内容如下:
清单 1: video.json
- {
- "id": "1009",
- "name": "黄飞鸿之英雄有梦",
- ,
- "isenabled": 1,
- 人","hotlevel ":0,"source ":0,"director ":"周显扬"}"
针对该资源设计的静态类 VideoRecord 结构:
清单 2: class VideoRecord
- 1 class VideoRecord
- 2 {
- 3 public:
- 4 INT hot;
- 5 INT hotlevel;
- 6 INT source;
- 7 INT isenable;
- 8 string id;
- 9 string name;
- 10 string director;
- 11 ......
- 12}
假如现在 video.json 中新增字段 copyright,videoRecord 类就要增加相应的成员变量 m_copyright。示例如下:
1.2 特点二:类结构泛化能力不足
一旦新增数据资源(例如:chanel.json),要么重新为该资源 channel.json 添加一个新的类结构 ChannelRecord,要么合并 channel.json 和 video.json 中的所有字段,在原有 VideoRecord 类上新增成员。不管怎样做,面对时常变化的需求,你可能会产生这样直观的感受:这样的代码抽象和泛化能力太弱了。
那么,能不能设计一种类结构,能够很好的解决静态类结构存在的所有问题,无论以后新增或者删除一个字段,或者新增或删除一种资源,都不必在让我们为此花费时间和心思呢?为此,需要在设计类上面花点心思,下面轮到动态类结构粉墨登场了。
2. 动态类结构
只需要做几个改变,我们就能实现成员类型、个数等可动态伸缩调整的动态类结构啦。第一:重新设计类结构,定义指向所有的成员变量的指针的指针 m_ppMember,可以通过 m_ppMember 访问到所有指向成员变量的指针。
第二:有了 m_ppMember 指向所有的成员变量的指针,那么变量的个数和类型如何得知呢?这里就需要一个配置文件,指明资源中有多少字段,每个字段是什么类型。此外还需要记录描述表,记录描述表通过读取配置文件生成,供动态类结构使用,因此记录描述表是动态类结构和配置文件的桥梁。
清单 3:配置文件 config.json
- "video": [{
- "field": "name",
- "type": "string"
- },
- {
- "field": "id",
- "type": "string"
- },
- {
- "field": "actor",
- "type": "string"
- },
- //演员
- {
- "field": "hot",
- "type": "int"
- },
- {
- "field": "hotLevel",
- "type": "int"
- }....... //其他字段,省略
- ]
- "channel": [{
- "field": "name",
- "type": "string"
- },
- {
- "field": "id",
- "type": "string"
- },
- {
- "field": "comment",
- "type": "string"
- },
- //评论
- {
- "field": "hot",
- "type": "int"
- },
- ....... //其他字段,省略
- ]
清单 4:记录控制表 class recCtrlTable
- 1#typedefstring FIELD
- 2#typedefintTYPE2 #typedefint POS
- 3 class RecCtrlTable
- 4 {
- 5 private:
- 6std::map>m_recDes; //记录控制表会根据config.json的配置,把每个field及其类型、位置,记录在m_recDes中,供动态类Record使用
- 7 ......
- 8};
3. 生成动态类对象
上面讲述了如何设计动态类结构。有了动态类结构后,我们应该怎么使用该类生成一个类对象呢?举个例子:还是使用上面的 video.json, 以其中的 director,name 和 hot 字段段:
(1) 程序运行时首先加载 config.json, 生成 RecCtrlTable 类对象 m_recCtrlTable 对象,
(2) 根据 m_recCtrlTable 中的 m_recDes 中的 field,读入 video 资源相应 feild 字段,并申请内存 pChar1-N,存放该 field 的值
(3) 最后把这些指针 pChar1-N 的首地址赋值给动态 Record 对象中的 m_ppMember。
来源: http://www.cnblogs.com/litaozijin/p/6683073.html