各位大侠,本人看深入浅出,看到以下代码有些晕,关于模拟动态创建的。CObject* PASCAL class_name::CreateObject()中,怎么会有这种函数声明的,没见过,返回类型是CObject* PASCAL ???PASCAL是_stdcall,表示函数参数从右向左传递,那这里CreateObject又没有参数!!!CObject* (PASCAL* m_pfnCreateObject)()中为什么不能是CObject* (PASCAL m_pfnCreateObject)()??很多不懂,请大家解释解释,详细点。^_^
谢谢。#define PASCAL _stdcall#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
////////////////////////////////////////////////////////////
CObject* PASCAL class_name::CreateObject() \
////////////////////////////////////////////////////////////
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
class_name::CreateObject)
struct CRuntimeClass
{
// 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;
CObject* CreateObject(); static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
}; CObject* pObject = NULL;
////////////////////////////////////////////////////////////
pObject = (*m_pfnCreateObject)();
////////////////////////////////////////////////////////////
谢谢。#define PASCAL _stdcall#define IMPLEMENT_DYNCREATE(class_name, base_class_name) \
////////////////////////////////////////////////////////////
CObject* PASCAL class_name::CreateObject() \
////////////////////////////////////////////////////////////
{ return new class_name; } \
_IMPLEMENT_RUNTIMECLASS(class_name, base_class_name, 0xFFFF, \
class_name::CreateObject)
struct CRuntimeClass
{
// 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;
CObject* CreateObject(); static CRuntimeClass* PASCAL Load(); // CRuntimeClass objects linked together in simple list
static CRuntimeClass* pFirstClass; // start of class list
CRuntimeClass* m_pNextClass; // linked list of registered classes
}; CObject* pObject = NULL;
////////////////////////////////////////////////////////////
pObject = (*m_pfnCreateObject)();
////////////////////////////////////////////////////////////
CObject*是函数返回值类型;
PASCAL是参数传递规范,好象是从左到右,调用者清栈;
class_name是类名;
CreateObject是方法名。
类成员函数被调用时,需要把类的指针作为参数传递给成员函数,所以即使函数没有定义参数,而实际上还有有一个参数的。
CObject*是函数返回值类型;
PASCAL是参数传递规范,好象是从左到右,调用者清栈;
class_name是类名;
CreateObject是方法名。
类成员函数被调用时,需要把类的指针作为参数传递给成员函数,所以即使函数没有定义参数,而实际上还有有一个参数的。还是不懂,那这个参数又是什么?
另外
CObject* (PASCAL* m_pfnCreateObject)()中为什么不能是CObject* (PASCAL m_pfnCreateObject)()??
那么CObject* (PASCAL* m_pfnCreateObject)(); 相当于
CObject** (PASCAL m_pfnCreateObject)(); 少了*相当于定义一个指向返回值是CObject(而非CObject *)的函数指针。嗯,那样标准代码那样写貌似容易让人混淆。^_^
CObject** (PASCAL m_pfnCreateObject)();相当于CObject** PASCAL m_pfnCreateObject();这不是定义指针变量,而是声明函数原形。