c++设计成员变量可动态调整的动态类结构

  本文主要介绍一下如何使用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 #typedef string FIELD
2 #typedef int TYPE2 #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-N,存放该field的值

(3)最后把这些指针pChar1-N的首地址赋值给动态Record对象中的m_ppMember。

时间: 2024-10-09 11:44:36

c++设计成员变量可动态调整的动态类结构的相关文章

Objective-C类成员变量深度剖析

目录 Non Fragile ivars 为什么Non Fragile ivars很关键 如何寻址类成员变量 真正的“如何寻址类成员变量” Non Fragile ivars布局调整 为什么Objective-C类不能动态添加成员变量 总结 看下面的代码,考虑Objective-C里最常见的操作之一——类成员变量访问. - (void)doSomething:(SomeClass *)obj { obj->ivar1 = 42; // 访问obj对象的public成员变量 int n = sel

Java反射机制可以动态修改实例中final修饰的成员变量吗?

问题:Java反射机制可以动态修改实例中final修饰的成员变量吗? 回答是分两种情况的. 1. 当final修饰的成员变量在定义的时候就初始化了值,那么java反射机制就已经不能动态修改它的值了. 2. 当final修饰的成员变量在定义的时候并没有初始化值的话,那么就还能通过java反射机制来动态修改它的值. 实验: 1. 当final修饰的成员变量在定义的时候就初始化了值 1 public Class Person { 2 private final String name = "damon

运行时。。::分类并不是不可以扩充成员变量,可以用运行时机制动态添加成员变量

运行时机制是纯C语言,平时写得OC代码最终都要转成C运行时代码 @property在category中只能实现get,set方法的声明,不能实现方法的实现 #import <objc/message.h> objc_setAssociatedObject(<#id object#>, <#const void *key#>, <#id value#>, <#objc_AssociationPolicy policy#>) static int h

再次进入程序,Java静态变量与成员变量的不同表现和对单例模式的思考

我们知道,在存储方式上,成员变量在JVM中是存储在堆里边的,而静态变量则位于JVM中的方法区,两者的主要区别在于,成员变量不再受引用常常会导致被回收,而方法区对垃圾回收的限制相当严苛,除非是整个应用被卸载,否则静态变量会一直存在. 在android应用中使用成员变量,在退出应用之后,所有的成员变量肯定会被回收,而静态变量则相反.尤其是在UI设计上,如果你自定义一个static的viewgroup,创建时候为其addchlid,你就一定要考虑到这个情况,因为再次进入程序,还是会调用addchild

CFormView动态调整对话框的尺寸并成比例调整部署控件

基于单文档的CFormView动态调整对话框的尺寸并成比例调整部署控件 如果你正在开发基于单文档程序,使用了CFormView基类实现多个窗口的显示,那么这个文档可能会给你提供些许帮助. 一.实现对话框填充客户区 当我们添加了资源对话框时,它的尺寸在客户区显示时是不会随着窗口的大小调整的,当框架尺寸小于它的尺寸时,还出现了滚动条,操作麻烦同时视觉效果也不良好. 思路 根据客户区的大小调整资源对话框的大小,而客户区大小由父级的框架进行设定. 步骤 1. 根据屏幕分辨率设定框架的尺寸 请注意,我们不

Delegate成员变量和Event的区别

上周五有同事问了我一个问题:Delegate和Event有什么区别?具体来说在设计一个类的时候,声明一个事件(Event)和声明一个Delegate类型的成员变量有啥区别. 我的第一反应是没啥区别,虽然从语法看起来不一样,但从代码希望达成的效果来看是一致的,本质都是回调函数.当然区别是肯定有的,我能给我的理由是两个:首先从与COM交互操作时,event对应COM接口中的事件:其次VS的编译环境对定义event提供了更加便捷的支持,可以为其自动生成回调函数的框架. 翻了翻MSDN,并没有直接描述两

C# 字段、属性、成员变量 [转载]

一.定义与作用 1.字段(field):是C#类级别定义的,和方法同一级别. 一般用来类内部进行访问,充当一种类中的"全局变量"角色:或者配合属性来使用 2.属性:同样是C#类级别定义的,一般是供外部类访问的. 3.成员变量:"全局变量",在类中定义的变量,区别于在方法中定义的局部变量.它与字段属性不是同一级别概念,字段,属性都可以叫做成员变量. 二.使用 class Basic { private string FieldVar;//这是字段,在当前类中调用 pr

成员变量的定义与使用

成员变量又称为成员属性,它是描述对象状态的数据,是类中很重要的组成成分.本节详细讨论如何来定义成员变量.成员变量的访问权限,以及静态成员变量与实例成员变量之间的区别. 成员变量的定义 定义成员变量的语法如下:[变量修饰符] 类型说明符变量名类的成员变量和在方法中所声明的局部变量都是用户标识符,它们的命名规则相同.变量修饰符是可选项,一个没有变量修饰符的变量定义如下: public class Cuber{ double width,height; int number; } 成员变量的类型可以是

面向对象,局部变量和成员变量

面向对象的编程关注与类的设计设计类实际上是设计类的成员基本的类的成员,属性(成员变量)&方法1.设计类,并设计类的成员(成员变量&成员方法)2.通过类,来创建类 的对象(累的实例化用new)3.通过“对象.属性”或“对象.方法”来调用,来完成相应的功能二.创建多个对象,彼此各自拥有一套类的属性.当对其中一个对象的属性进行修改是,不会影响其他对象的属性值三.类的属性(成员变量)成员变量vs局部变量相同点:1.遵循变量声明的格式:修饰符 数据类型 变量名=初始化值 2.都有作用范围不同点:1.