c++设计成员变量可动态调整的动态类结构
2018-06-17 22:51:36来源:未知 阅读 ()
本文主要介绍一下如何使用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指向所有的成员变量的指针,那么变量的个数和类型如何得知呢?这里就需要一个配置文件,指明资源中有多少字段,每个字段是什么类型。此外还需要记录描述表,每种资源都会产生一个独立的记录描述表,记录描述表通过读取配置文件生成,供动态类结构使用,因此记录描述表是动态类结构和配置文件的桥梁。由于Record并不含有成员变量类型等描述信息,Record对象的序列化和反序列化,必须借助m_type找寻到相应的记录控制表,才能完成。
清单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 #typedef string FIELD 2 #typedef int TYPE
2 #typedef int POS 3 class RecCtrlTable 4 { 5 private: 6 std::map<FIELD,std::pair<TYPE,POS>>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...pCharN,存放该field的值;
(3)最后把这些指针pChar1...pCharN的首地址赋值给动态Record对象中的m_ppMember;
从以上描述可以看出,每个Record类对象只记录该对象的资源类型m_type和成员变量值的指针,Record对象的成员变量值的写入和读取,需要依赖于记录控制表,这样做,虽然增加了实现的复杂度,但是节约很大一部分内存。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:逆波兰算法~简单理解栈
下一篇:P1576 最小花费
- C++ 转换函数搭配友元函数 2020-06-10
- C++ 自动转换和强制类型转换(用户自定义类类型) 2020-06-10
- C++ rand函数 2020-06-10
- C++ 友元函数 2020-06-10
- C++ 运算符重载 2020-06-10
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash