MFC中的动态创建与运行时识别

本文详细介绍了MFC中如何实现运行时类型识别与动态创建对象,包括宏定义中的"#"与 “##”的功能,以及DECLARE_DYNAMIC、IMPLEMENT_DYNAMIC等宏的使用。通过CRuntimeClass类构建单向树结构来判断类的继承关系,并提供动态创建对象的接口。
摘要由CSDN通过智能技术生成

MFC中支持运行时类型识别与动态创建。这更多的是设计问题。理解了其中的设计,可以更快定位用MFC框架开发的代码。通过研究MFC实现这些的细节,可以更快地掌握其他开发框架的设计思想。

宏定义中的"#"与 “##”
MFC框架大量使用了宏定义来“自动”完成框架的声明与实现工作。因此首先复习下宏中的#与##功能是有必要的。

“#”
单独的一个#符号,作用是“字符串化”,比如:

#define ToString(x) #x
则有:

int main()
{
//相当于printf("%s\r\n", “Hello, world!”);
printf("%s\r\n", ToString(Hello, world!);
}
有些框架中会利用这样的字符串化,形成字符常量到字符串的映射,比如,用这样的方法制作消息响应表:

struct tagMsgMap {
int nMsg;
char *szMsg;
};

#define MSG_ENTRY(Msg) {Msg, #Msg}

tagMsgMap g_MsgMapEntry[]= {
MSG_ENTRY(WM_COMMAND),
MSG_ENTRY(WM_KEYUP),

};
“##”

"##"的作用常被解释为“连接符”,其实从其存在目的解释,说成“分隔符”也不算错。因为设计它的目的之一就是用来解决某些情况下不能用空格来分隔宏定义的问题。比如:

#define PRE(name) prefix_##name
以上的例子,若将##换成空格,则prefix_

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值