您的位置:首页 > 编程语言 > C语言/C++

C++动态对象生成技术

2005-12-09 23:40 417 查看
Native C++是不支持根据类名动态地生成对象的,比如从一个文本文件中读取类名然后构造一个对象.主要原因是没有丰富的动态元信息,没有单根类库。
然而可以用几种技术进行实现。如果是类似Spring那样的根据配置文件运行时产生实现某个接口的对象,那么在Windows中至少有三种办法:
1. LoadLibrary + GetProcAdress。这个不用多解释,可以把DLL和Proc的名字
动态传入。
2. COM,根据动态获得的CLSID调用GetClassObject获得IClassFactory接口,然
后CreateInstance。或者直接调用CoCreateInstance/CoCreateInstanceEx动态产生
CoClass。
3. MFC dynamic creation,参见侯捷《深入浅出MFC》。
Native C++不能在运行时编译代码并即时产生对象,所以JIT的动态生成在C++里做不到。但是.NET里可以emit CIL code,所以C++/CLI是否能解决该问题,我不清楚。(??)
在MFC中,可以参考,总结如下:
MFC的动态创建可能是最容易使用的方案。查了一下MFC中RTCI的实现,总结一下:
DECLARE_ DYNCREATE(class_name)宏展开后是如下形式:
假设class_name是“CMyClass”
public:
static CRuntimeClass classCMyClass;
virtual CRuntimeClass* GetRuntimeClass() const;
static CObject* CreateObject();
这几行会被加入到CMyClass类的声明中。

IMPAEMENT_DYNCREATE(classname,base_classname)宏定义比较复杂,这个宏展开后类似如下的样子:
AFX_DATADEF CRuntimeClass CMyClass::classCMyClass = {
"CMyClass",sizeof(CMyClass),0xFFFF,NULL,RUNTIME_CLASS(CObject),NULL};
static const AFX_CLASSSINIT _init_CMyClass(&CMyClass::classCMyClass);
CRuntimeClass* CMyClass::GetRuntimeClass() const
{
Return & CMyClass::classCMyClass;
}
CObject* PASCAL CMyClass::CreateObject()
{
return new CMyClass;
}
这个宏做了如下3件事情:
1.初始化CRuntimeClass类型的成员变量classCMyClass
2.创建静态AFX_CLASSINIT结构,该结构如下:
Struct AFX_CLASSINIT
{AFX_CLASSINIT(CRuntimeClass* pNewClass);};
这个步骤地主要作用是把CMyClass::classCMyClass添加到MFC的一个内部链表中去。
3.覆盖GetRuntimeClass(),以返回成员变量classCMyClass的地址。
RUNTIME_CLASS宏展开后如下:
(&class_name::class##class_name)
动态创建对象的时候,调用CRuntime::CreateObject()方法。
这个方法实际上会去调用CRuntime中的一个成员指针,这个指针指向的正是
CMyClass::CreateObject()方法。
由上可见,RuntimeClass宏可接受字符串作为参数,但是,仍然需要在编译时定义好需要动态创建的对象类型,上文例子中为CMyClass。通过MFC的这个特性,理论上还是可以从配置文件中读取文本,然后按照文本指定的类型动态创建对象,但必须要求在编译时就存在这种类型,不能像动态语言那样无限制的扩展。
另外CMyClass必须继承自CObject。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: