C++ RTTI: 2个宏实现“根据对象名创建对象”

1. 问题提出:

C++ RTTI缺乏一些运行时信息,无法根据对象名直接创建对象。所以MFC为了实现序列化,从头构造了自己的RTTI信息,并定义了一整套宏。具体可以参考MFC源代中一下类和宏的实现:
CRuntimeClass, CObject, DECLARE_DYNAMIC, IMPLEMENT_DYNAMIC

2. 需求:
个人正在写一个做集成测试的工具,有一个配置文件,用于指定哪些CASE需要被测试到,内容大致如下:
<ut>
     <case name="case1"/>
     <case name="case2"/>
</ut>

当测试工具导入该配置信息时候,必须能够根据 “case1", "case2"等名字创建相应的Case对象。显然C++没有提供类似的功能。

3. 实现:
仿照MFC Serialize的实现,定义一个基类和2个宏。需要被动态创建的对象从该基类派生,并使用2个宏注册到对象工厂,然后就可以使用对象工厂根据对象名创建该对象。
基类和宏的定义:
class CUTObject
{
public:
     virtual ~CUTObject(){}
     virtual void  SetUTName(CFString name);
     virtual CFString GetUTName();
     virtual CUTObject* Clone(){ return NULL; }
private:
     CFString m_strUTName;
};

#de

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Delphi的运行时类型信息(RTTI)是在程序编译后生成的,它能够提供程序中各种对象的类型和成员信息。而Borland Package Library(BPL)是一种库文件格式,可以将Delphi代码编译成二进制形式,并且可以在运行时被动态加载。 要使用Delphi的RTTI加载BPL文件,首先需要确保BPL文件已被正确编译生成。在Delphi开发环境中,可以通过编译项目生成BPL文件,确保在项目选项中的“生成”部分选择“包装编译”。 一旦BPL文件生成后,可以在Delphi代码中使用RTTI来加载它。在代码中,需要首先将BPL文件加载到内存中,可以使用LoadPackage函数来实现。LoadPackage函数接受BPL文件的完整路径作为参数,并返回一个HMODULE类型的句柄。 使用RTTI加载BPL文件的步骤如下: 1. 使用LoadPackage函数将BPL文件加载到内存中,并获取返回的句柄。 2. 使用GetModuleSymbols函数获取BPL文件中导出的符号列表。 3. 使用GetAddress函数获取需要使用的符号的地址。 4. 将获取到的地址转换成需要的类型,并使用该类型的功能。 使用RTTI加载BPL文件可以实现动态加载和调用其他模块中的函数、过程和类等功能。这使得开发者能够通过加载BPL文件来扩展程序的功能,提高了程序的灵活性和可扩展性。 需要注意的是,在使用RTTI加载BPL文件时,要确保加载的BPL文件与应用程序的目标平台、编译器版本等兼容,否则可能会引发不可预料的错误。另外,加载过多的BPL文件也可能导致程序性能下降,因此在设计时应考虑加载BPL文件的数量和大小。同时,加载BPL文件也可能存在安全风险,因此要谨慎选择加载的BPL文件来源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dengyunze

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值