我最近在看<深入浅出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;
}

解决方案 »

  1.   

    你是用到了的,看你下面的代码:你构造CRuntimeClass时要填写参数 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;} \
      

  2.   

    通过字符串形式的类名创建对象。是MFC宏生成的。
      

  3.   

    哈哈,这个问题我当时也遇到过,也想了很久。
    在宏定义那有,二楼正解,函数指针,就是pfnew。
    如果只有DECLARE_DYNAMIC的类,那个指针为NULL;
    如果有DECLARE_DYNCREATE的类,那个指针就被赋值为一个函数,即可动态创建。