博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
反射(二)
阅读量:5790 次
发布时间:2019-06-18

本文共 7521 字,大约阅读时间需要 25 分钟。

通过上一节的例子,在反射里加入数据成员,属性等,实现更加复杂的对象。

1.实现

1 #define DATAPROP(n) {&self::n,#n,0}  2 #define ATTRPROP(n) {&self::get##n,&self::set##n,#n,0}  3 #define FUNCPROP(n) {&self::n,#n,0}  4     class ObjectClass : public Object  5     {  6         DECL_RTTI(ObjectClass, Object);  7         DECL_TPLT(ObjectClass);  8     private:  9         static  const ClassProperty& GetPropertys() 10         { 11             const static ClassProperty::BaseProperty bp[] = { &base::GetPropertys,vNull }; 12             const static DataProperty dp[] = 13             { 14                 DATAPROP(intValue), 15                 DATAPROP(blValue), 16                 DATAPROP(sintValue), 17                 DATAPROP(floatValue), 18                 DataProperty() 19             }; 20             const static AttrProperty ap[] =  21             {  22                 ATTRPROP(Int), 23                 AttrProperty() 24             }; 25             const static FuncProperty fp[] = { FuncProperty() }; 26             const static ClassProperty prop(bp, dp, ap, fp); 27             return prop; 28         } 29     private: 30         int  getInt()const { return intValue; } 31         void setInt(int i) { intValue = i; } 32     public: 33         int intValue; 34         bool blValue; 35         sint sintValue; 36         f32  floatValue; 37     }; 38     class ClassWithProperty : public Object 39     { 40         DECL_RTTI(ClassWithProperty, Object); 41         DECL_TPLT(ClassWithProperty); 42     public: 43         static  const ClassProperty& GetPropertys() 44         { 45             const static ClassProperty::BaseProperty bp[] = { &base::GetPropertys,vNull }; 46             const static DataProperty dp[] =  47             {  48                 DATAPROP(rawString), 49                 DATAPROP(intValue), 50                 DATAPROP(blValue), 51                 DATAPROP(sintValue), 52                 DATAPROP(floatValue), 53                 DATAPROP(strValue), 54                 DATAPROP(objClassPointer), 55                 DATAPROP(objClassValue), 56                 DataProperty()  57             }; 58             const static AttrProperty ap[] =  59             { 60                 ATTRPROP(Int), 61                 ATTRPROP(Bool), 62                 ATTRPROP(Float), 63                 ATTRPROP(String), 64                 AttrProperty()  65             }; 66             const static FuncProperty fp[] =  67             {  68                 {&self::getValString,"ValString",0}, 69                 {&self::getPtrString,"PtrString",0}, 70                 {&self::getRefString,"RefString",0}, 71                 FuncProperty()  72             }; 73             const static ClassProperty prop(bp,dp,ap,fp); 74             return prop; 75         } 76     public: void displayProperty(int depth,const ClassProperty* props) 77     { 78         if (props == nullptr)return; 79             const DataProperty* dp = props->getDataProperty(); 80             while (dp->type != Type::vNone) 81             { 82                 int n = depth; 83                 while (n-- >= 0)LOG_P("  "); 84                 LOG_P("%s %s\n", dp->type.getName(),dp->desc); 85                 const Type currType = dp->type; 86                 if (currType != Type::vNone) 87                 { 88                     displayProperty(depth + 1, currType.getPropertys()); 89                 } 90                 const Type* baseTypes = dp->type.getBaseTypes(); 91                 while (*baseTypes != vNull) 92                 { 93                     displayProperty(depth + 1,baseTypes->getPropertys()); 94                     baseTypes++; 95                 } 96                 dp++; 97             } 98  99             const AttrProperty* ap = props->getAttrProperty();100             while (ap->type != Type::vNone)101             {102                 int n = depth;103                 while (n-- >= 0)LOG_P(" ");104                 LOG_P("%s %s\n", ap->type.getName(), ap->desc);105                 const Type* baseTypes = ap->type.getBaseTypes();106                 ap++;107             }108 109             const FuncProperty* fp = props->getFuncProperty();110             while (fp->type != Type::vNone) 111             {112                 int n = depth;113                 while (n-- >= 0)LOG_P(" ");114                 LOG_P("%s %s\n", fp->type.getName(), fp->desc);115                 const Type* baseTypes = fp->type.getBaseTypes();116                 fp++;117             }118         }119     public:120         int  getInt()const { return intValue; }121         void setInt(int i) { intValue = i; }122         bool getBool()const { return blValue; }123         void setBool(bool b) { blValue = b; }124         sint getLong()const { return sintValue; }125         void setLong(sint l) { sintValue = l; }126         f32  getFloat()const { return floatValue; }127         void setFloat(f32 f) { floatValue = f; }128         void setString(AString s) { strValue = s; }129         AString getString()const { return strValue; }130     public:131         const AString& getRefString(const AString& i)132         {133             LOG_P("RefString:%s\n", i.getRawString());134             static AString as = AtomString("atomString"); 135             return as;136         }137         const AString  getValString(const AString  i)138         {139             LOG_P("ValString:%s\n", i.getRawString());140             return AtomString("atomString"); 141         }142         const AString* getPtrString(const AString* i)143         { 144             LOG_P("PtrString:%s\n", i->getRawString());145             static AString as = AtomString("atomString"); return &as; 146         }147     private:148         char* rawString;149         AString strValue;150         int intValue;151         bool blValue;152         sint sintValue;153         f32  floatValue;154         ObjectClass* objClassPointer;155         ObjectClass  objClassValue;156     };

 

 

2.使用

1         ClassWithProperty ct; 2         ct.displayProperty(0, &ct.getProperty()); 3         ct.DataMember["blValue"] = "true"; 4         bool bl = ct.DataMember["blValue"]; 5         std::cout << bl << std::endl; 6         ct.DataMember["objClassValue"]["intValue"] = "12"; 7         int rf = ct.DataMember["objClassValue"]["intValue"]; 8         std::cout << rf << std::endl; 9         Object& subObj = ct.DataMember["objClassValue"];10         subObj.DataMember["intValue"] = 13.5f;11         unsigned int rf2 = ct.DataMember["objClassValue"]["intValue"];12         std::cout << rf2 << std::endl;13         u32 iv = ct.DataMember["objClassValue"]["intValue"];14         std::cout << iv << std::endl;15         float rfu8 = ct.DataMember["objClassValue"]["intValue"];16         std::cout << rfu8 << std::endl;17         double rfud = ct.DataMember["objClassValue"]["intValue"];18         std::cout << rfud << std::endl;19 20         FuncProperty fp = ct.getProperty().getFuncProperty("ValString");21         AString s = fp.invoke
(&ct,"value");22 LOG_P("ValString ret:%s\n", s.getRawString());23 24 fp = ct.getProperty().getFuncProperty("RefString");25 AString& rs = fp.invoke
(&ct, &AString("reff"));26 LOG_P("RefString ret:%s\n", rs.getRawString());27 28 fp = ct.getProperty().getFuncProperty("PtrString");29 AString* ps = fp.invoke
(&ct, &AString("pointer"));30 LOG_P("PtrString ret:%s\n", ps->getRawString());

3.结果

   

 

转载于:https://www.cnblogs.com/goooon/p/5651975.html

你可能感兴趣的文章
maven 安装 出现 错误: 找不到或无法加载主类 org.codehaus.plexus.classworlds.launcher.Launche...
查看>>
在linux使用rar压缩工具
查看>>
Apache的MaxClients参数及其对Tomcat执行Full GC的影响(四)
查看>>
云计算,SDN,虚拟化三者关系
查看>>
我的友情链接
查看>>
python中的模块
查看>>
router os命令删除防火墙规则
查看>>
【Python3】04、内置数据结构
查看>>
ulimit的openfiles的修改(永久生效)
查看>>
XenServer 6.5实战系列之七:Creating Windows Server 2012R2 VM
查看>>
Lab 2 循序渐进配置Windows Server 2012 AD CS(颁发机构&联机响应篇)
查看>>
sass安装
查看>>
我的2016年linux学习决心书
查看>>
3D图形渲染管线
查看>>
初识容器与Docker
查看>>
expect 批量拷贝SSH pub key文件并且批量执行简单脚本
查看>>
Ubuntu下Linux常用命令详细介绍
查看>>
QMap的成员函数insert
查看>>
CentOS7使用firewalld打开关闭防火墙与端口
查看>>
centos7下使用iptables
查看>>