C 动态创建对象应用技术讲解
创始人
2024-06-22 19:20:25
0

C++是一款功能强大的基于C语言的计算机编程语言。它不但能支持各种C语言的功能,还可以对包括面向对象在内的各种程序设计风格的支持。我们今天会为大家详细介绍一下有关C++动态创建对象的一些应用技巧。#t#

Native C++是不支持根据类名的C++动态创建对象,比如从一个文本文件中读取类名然后构造一个对象.主要原因是没有丰富的动态元信息,没有单根类库。然而可以用几种技术进行实现。如果是类似Spring那样的根据配置文件运行时产生实现某个接口的对象,那么在Windows中至少有三种办法:

1. LoadLibrary + GetProcAdress。这个不用多解释,可以把DLL和Proc的名字动态传入。

2. COM,根据动态获得的CLSID调用GetClassObject获得IClassFactory接口,然后CreateInstance。或者直接调用CoCreateInstance/CoCreateInstanceEx动态产生CoClass。

3. MFC dynamic creation。

Native C++不能在运行时编译代码并即时产生对象,所以JIT的动态生成在C++里做不到。在MFC中,可以参考,总结如下:

MFC的C++动态创建对象可能是最容易使用的方案。查了一下MFC中RTCI的实现,总结一下:

DECLARE_ DYNCREATE(class_name)宏展开后是如下形式:

假设class_name是“CMyClass”

  1. public:  
  2. static CRuntimeClass classCMyClass;  
  3. virtual CRuntimeClass* GetRuntimeClass() const;  
  4. static CObject* CreateObject(); 

这几行会被加入到CMyClass类的声明中。

IMPAEMENT_DYNCREATE(classname,base_classname)宏定义比较复杂,这个宏展开后类似如下的样子:

  1. AFX_DATADEF CRuntimeClass CMyClass::classCMyClass = {  
  2. "CMyClass",sizeof(CMyClass),0xFFFF,NULL,RUNTIME_CLASS(CObject),NULL};  
  3. static const AFX_CLASSSINIT _init_CMyClass(&CMyClass::classCMyClass);  
  4. CRuntimeClass* CMyClass::GetRuntimeClass() const  
  5. {  
  6. Return & CMyClass::classCMyClass;  
  7. }  
  8. CObject* PASCAL CMyClass::CreateObject()  
  9. {  
  10. return new CMyClass;  

这个宏做了如下3件事情:

1.初始化CRuntimeClass类型的成员变量classCMyClass

2.创建静态AFX_CLASSINIT结构,该结构如下:

  1. Struct AFX_CLASSINIT  
  2. {AFX_CLASSINIT(CRuntimeClass* pNewClass);}; 

这个步骤地主要作用是把CMyClass::classCMyClass添加到MFC的一个内部链表中去。

3.覆盖GetRuntimeClass(),以返回成员变量classCMyClass的地址。

  1. RUNTIME_CLASS宏展开后如下:  
  2. (&class_name::class##class_name) 

C++动态创建对象的时候,调用CRuntime::CreateObject()方法。

这个方法实际上会去调用CRuntime中的一个成员指针,这个指针指向的正是CMyClass::CreateObject()方法。

由上可见,RuntimeClass宏可接受字符串作为参数,但是,仍然需要在编译时定义好需要动态创建的对象类型,上文例子中为CMyClass。通过MFC的这个特性,理论上还是可以从配置文件中读取文本,然后按照文本指定的类型C++动态创建对象,但必须要求在编译时就存在这种类型,不能像动态语言那样无限制的扩展。另外CMyClass必须继承自CObject。

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...