现在的位置: 首页 > 综合 > 正文

MFC的RUNTIMECLASS 的探讨

2013年01月07日 ⁄ 综合 ⁄ 共 1399字 ⁄ 字号 评论关闭

高手请指教

在多文档的程序中, InitInstance()这个关键的初始化函数中有这样一段代码

************************************************************

CMultiDocTemplate* pDocTemplate;
 pDocTemplate = new CMultiDocTemplate(
  IDR_PAINTETYPE,
  RUNTIME_CLASS(CPainterUsePatternDoc),
  RUNTIME_CLASS(CChildFrame), // custom MDI child frame
  RUNTIME_CLASS(CPainterUsePatternView));
 AddDocTemplate(pDocTemplate);

*************************************************************

里面的RUNTIME_CLASS没有见过,是什么东东?

在AFX.H里面有源代码

*************************************************************

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

#define ASSERT_KINDOF(class_name, object) /
 ASSERT((object)->IsKindOf(RUNTIME_CLASS(class_name)))

*************************************************************

这个定义我又有不明白,"##"是什么东东??在MSDN中查到

*************************************************************

#define paster( n ) printf( "token" #n " = %d", token##n ) int token9 = 9; 

//将paster(n)定义为printf( "token" #n " = %d", token##n )

//那么
paster( 9 );//这个函数等同于以下函数
printf( "token" "9" " = %d", token9 );

//就变成了

printf( "token9 = %d", token9 );

***********************************************************

我们明白了'##'实际上就是连接两个字符串,回到刚才的定义

#define RUNTIME_CLASS(class_name) ((CRuntimeClass*)(&class_name::class##class_name))

宏定义RUNTIME_CLASS(class_name)为((CRuntimeClass*)(&class_name::class##class_name))

class_name是一个参数,代表了类名

CRuntimeClass是一个结构

将class_name类的一个叫做class##class_name 的结构的地址取出将其类

型转换为struct CRuntimeClass *类型

 

(待续)

抱歉!评论已关闭.