高手请指教在多文档的程序中, 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是一个结构RUNTIME_CLASS(CChildFrame) 等同于
((CRuntimeClass*)(&CChildFrame::classCChildFrame))
但这样定义了有什么用?
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是一个结构RUNTIME_CLASS(CChildFrame) 等同于
((CRuntimeClass*)(&CChildFrame::classCChildFrame))
但这样定义了有什么用?
RUNTIME_CLASS宏就类似于这个函数的调用。
{
// Attributes
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema; // schema number of the loaded class
CObject* (PASCAL* m_pfnCreateObject)(); // NULL => abstract class
CRuntimeClass* m_pBaseClass;
// CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
};
能具体说一下这个结构,是如何记录类的吗?
在这里面m_lpszClassName是不是类名
前面是类型转换(CRuntimeClass*)
后面不懂是什么?
(&CChildFrame::classCChildFrame)
m_pBaseClass记录当前类的基类的
int m_nObjectSize表示类的空间大小
CRuntimeClass* m_pNextClass表示连接在他下面的一个结构
怎么相关??分是身外之物
请高手说明
CChildFrame是一个类
我想:
上面是先执行
CChildFrame::classCChildFrame
这是类的变量还是函数,定义了吗?为什么要再取地址‘&’
再线等,弄清立刻结贴,信誉保证
struct CRuntimeClass
{
LPCSTR m_lpszClassName;
int m_nObjectSize;
UINT m_wSchema
CObject* (PASCAL* m_pfnCreateObject)( );
CRuntimeClass* (PASCAL* m_pfnGetBaseClass)( );
CRuntimeClass* m_pBaseClass;
CObject* CreateObject( );
BOOL IsDerivedFrom(const CRuntimeClass* pBaseClass) const;
};他的效率在某些应用中比较低。如果这样的话,尽量避免遍历的出现,可以用一些状态变量完成某些工作。总之要从设计上的应用和结构来考虑。
# define DECLARE_DYNAMIC(class_name)\ 斜杠表示连接作用
public:
static CRuntimeClass class##class_name;\ //这里就是class##CChildFrame的连接
virtual CRuntimeClass *GetRuntimeClasss() const;//*号实现的宏类似的太长了
((CRuntimeClass*)(&CChildFrame::classCChildFrame))class_name 为CChildFrame类
&CChildFrame::classCChildFrame
我想是
将CChildFrame类中的一个叫做classCChildFrame 的变量的地址取出将其类型转换为struct CRuntimeClass *类型问题classCChildFrame这个变量还没定义吧?就算有定义,怎么能把一个变量的地址
转换成结构指针??
class##class_name 他也是个结构。
这是申明。静态的:
static AFX_DATA CRuntimeClass class##class_name;