c++动态的生成对象的方法

  介绍

这篇文章主要介绍了c++动态的生成对象的方法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>实现理由

有时候开发真是有些矛盾,例如:1,实现一个功能可以使用大量相似的代码,也可以使用模板,那我们怎么选择呢? 2,如果实现一个类之后,他有大量的属性,而且这些属性都需要设置和获取方法,那么我们还是要按Ctrl + C和Ctrl + V吗?如果有好多这样的类,还是Ctrl + C和Ctrl + V吗?对于第一个问题,一个力求上进开发人员,我相信他会选择模板,第二个问题的答案,也就是我们这篇文章所需要讲到的东西,动态生成对象,序列化和反序列化。

<强>实现思路

其实这个功能实现起来代码量还是比较少的,就是使用大量的宏和工厂模式

1,写一个工厂类,专门用于生成对象

typedef  void  *, (*, CreateClass)(空白);      class  CClassFactory   {   公众:   ,static  CClassFactory ,, IntanceFactory ();      公众:   ,void  *, CreateObject (const  std:: string ,,类名);   ,void  RegistClass (const  std:: string ,,名字,,const  CreateClass ,,方法);      私人:   ,std:: map, m_classMap;   };

2,然后在写一个方便类,这个类仅仅是为了注册方便,当这个类被声明的时候,即注册一个类到工厂中

class  CDynamicClass   {   公众:   ,CDynamicClass (const  std:: string ,,名字,,const  CreateClass ,,方法)   ,{   ,CClassFactory: IntanceFactory () .RegistClass(名称,方法);   ,}   };

3、2个关键的宏,这两个宏一个是用于CDynamicClass静态对象的,一个是用于初始化CDynamicClass对象的,作用请看上一小节,呵呵呵,其实就是注册宏的参数类到工厂

, # define  DECLARE_CLASS \(名称)   ,std:: string  className # #名称;\   ,static  CDynamicClass  *, className # # Namedc;   ,   ,# define  IMPLEMENT_CLASS \(名称)   ,CDynamicClass  *,类名::className # # Namedc =, new  CDynamicClass (# className,,类名::实例);

4, 2个属性宏,ACCESS_INTERFACE宏用于注册属性的相关接口,ACCESS_REGISTER宏是把属性名字和对象的属性调用接口记录起来,方便以后设置属性

# define  ACCESS_INTERFACE (classType、,类型,名称,描述)\   公众:\   ,std:: string  m_Describe # # name =#描述;\   ,inline  static  void 设置# #名(CBaseClass  *, cp,, void  *,值){\   ,classType  *, tp =, (classType  *) cp; \   ,tp→m_ # # name =, * (type  *)价值;\   ,}\   ,inline  type  # #名字(空白),const  {\   ,return  m_ # #名称;\   ,}\   ,inline  std:: string  # # # #名称描述(){\   ,return  m_Describe # #名称;\   ,}      # define  ACCESS_REGISTER \(名字)   ,m_propertyMap.insert({#名大敌;设置# # name });

5,基类,所有对象的基类,m_propertyMap成员是存储属性和属性对于的套接口对

class  CBaseClass   {   公众:   ,CBaseClass (), {}   ~,virtual  CBaseClass (), {}      公众:   ,std:: map, m_propertyMap;      私人:   };

<>强测试类

class  CHelloClass : public  CBaseClass   {   公众:   ,DECLARE_CLASS (CHelloClass);   ,ACCESS_INTERFACE (CHelloClass, int,,年龄,,“年龄“)   ,ACCESS_INTERFACE (CHelloClass, int,,,,“性别“)      公众:   ,CHelloClass ();   ~,virtual  CHelloClass ();      公众:   ,static  void  *,实例();   ,   公众:   ,virtual  void  RegistProperty (,);      保护:   ,int  m_Age =, 0;   ,int  m_Sex =, 0;   };

CHelloClass类是一个测试类,用于测试第三节所写的动态生成对象是否正确,RegistProperty接口里边是对属性的注册

<强> 1,测试主要函数

int 主要(int 命令行参数个数,char  * argv [])   {   ,QCoreApplication (命令行参数个数,argv);         ,CHelloClass  *, pVar =, (CHelloClass *) CClassFactory: IntanceFactory () .CreateObject (“CHelloClass");   ,if  (pVar)   ,{   ,int  pAge =, 2;   ,int  pSex =, 1;      ,pVar→m_propertyMap [“Age"] (pVar,和页面);   ,pVar→m_propertyMap [“Sex"] (pVar,和pSex);      ,std:: cout  & lt; & lt;, pVar→GetAgeDescribe (), & lt; & lt;, pVar→GetAge (), & lt; & lt;, std:: endl;   ,std:: cout  & lt; & lt;, pVar→GetSexDescribe (), & lt; & lt;, pVar→GetSex (), & lt; & lt;, std:: endl;   ,}      ,return  a.exec ();   }

c++动态的生成对象的方法