我最近在看<深入浅出MFC>,看到第三章RTTI, 我仿照书上写了CRuntimeClass的一个程序,
但是不太明白,在CRuntimeClass这个结构中CObject* ( *m_pfnCreateObject)();的作用是什么.
这是个函数指针,可是我这个程序中都没用过它,把它注释掉再编译,就提示错误,可是我这个程序就没用过它呀,
这是为什么呢?
#include <iostream.h>
#include <string.h>#define PASCAL _stdcallclass CObject;
struct CRuntimeClass;struct CRuntimeClass{ char* m_lpszClassName;
int m_nObjectSize;
int m_wSchema;
CObject* (PASCAL* m_pfnCreateObject)();
CRuntimeClass *m_pBaseClass;
CRuntimeClass *m_pNextClass; static CRuntimeClass* pFirstClass;
};struct AFX_CLASSINIT
{
AFX_CLASSINIT(CRuntimeClass* pNewClass);
};AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass* pNewClass)
{
pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
CRuntimeClass::pFirstClass = pNewClass;
}#define RUNTIME_CLASS(class_name) \
(&class_name::class##class_name)#define DECLARE_DYNAMIC(class_name) \
public: \
static CRuntimeClass class##class_name; \
virtual CRuntimeClass* GetRuntimeClass() const;#define _IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, wSchema, pfnNew) \
static char _lpsz##class_name[] = #class_name; \
CRuntimeClass class_name::class##class_name = { \
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name;} \#define IMPLEMENT_DYNAMIC(class_name, base_class_name) \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, NULL)
class CObject
{
public:
virtual CRuntimeClass* GetRuntimeClass() const;
static CRuntimeClass classCObject;
CObject::CObject() { cout << "CObject Constructor \n"; }
CObject::~CObject() { cout << "CObject Destructor \n"; }
};static char szCObject[] = "CObject";
CRuntimeClass CObject::classCObject = { szCObject, sizeof(CObject), 0xffff, NULL, NULL};static AFX_CLASSINIT _init_CObject(&CObject::classCObject);
CRuntimeClass* CObject::GetRuntimeClass() const
{
return &CObject::classCObject;
}class CCmdTarget : public CObject
{
public:
DECLARE_DYNAMIC(CCmdTarget)
CCmdTarget::CCmdTarget() { cout << "CCmdTarget Constructor \n"; }
CCmdTarget::~CCmdTarget() { cout << "CCmdTarget Destructor \n"; }
};IMPLEMENT_DYNAMIC(CCmdTarget,CObject)class CWinThread : public CCmdTarget
{
public:
DECLARE_DYNAMIC(CWinThread)
CWinThread::CWinThread() { cout << "CWinThread Constructor \n"; }
CWinThread::~CWinThread() { cout << "CWinThread Destructor \n"; }
};IMPLEMENT_DYNAMIC(CWinThread,CCmdTarget)CRuntimeClass* CRuntimeClass::pFirstClass = 0;int main()
{
cout << "start\n";
CRuntimeClass *current;
current = CRuntimeClass::pFirstClass;
while(current)
{
cout << current->m_lpszClassName << endl;
cout << current->m_wSchema << endl;
current = current->m_pNextClass ;
}
return 1;
}
解决方案 »
- 如何选择是通过win32创建dll还是通过MFC创建dll?
- 求助:关于vs2010编程
- 郁闷,Paint.net已经不再开放源代码了!最新版本的滤镜代码看不到了。
- 在写消息映射的时候,说syntax error : ','
- 怎么样在xp系统下和wince系统下的,抓取屏幕上的文字信息,包括应用程序的对话框、菜单、文字内容、IE浏览器中的文字??
- 请问怎么做ActiveX的方法的输入参数?
- 奇怪的内存问题,请教
- delete 放掉new申请的内存,出现非法有哪几种情况?
- 图形填充算法
- "\"在这里是什么意思?
- 请问定义一个字符串以后,为什么总是自动被赋值进去?
- 如何在VC或Linux下获取外网IP(本地配置,路由+PC,路由直接拨号上网)
_lpsz##class_name, sizeof(class_name), wSchema, pfnNew, \
RUNTIME_CLASS(base_class_name), NULL }; \
static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name); \
CRuntimeClass* class_name::GetRuntimeClass() const \
{ return &class_name::class##class_name;} \
在宏定义那有,二楼正解,函数指针,就是pfnew。
如果只有DECLARE_DYNAMIC的类,那个指针为NULL;
如果有DECLARE_DYNCREATE的类,那个指针就被赋值为一个函数,即可动态创建。