各位大侠,本人看深入浅出,看到以下代码有些晕,关于模拟动态创建的。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)();
////////////////////////////////////////////////////////////

解决方案 »

  1.   

    CObject* PASCAL class_name::CreateObject()中,
    CObject*是函数返回值类型;
    PASCAL是参数传递规范,好象是从左到右,调用者清栈;
    class_name是类名;
    CreateObject是方法名。
    类成员函数被调用时,需要把类的指针作为参数传递给成员函数,所以即使函数没有定义参数,而实际上还有有一个参数的。
      

  2.   

    cnzdgs说道CObject*   PASCAL   class_name::CreateObject()中, 
    CObject*是函数返回值类型; 
    PASCAL是参数传递规范,好象是从左到右,调用者清栈; 
    class_name是类名; 
    CreateObject是方法名。 
    类成员函数被调用时,需要把类的指针作为参数传递给成员函数,所以即使函数没有定义参数,而实际上还有有一个参数的。还是不懂,那这个参数又是什么?
    另外
    CObject*   (PASCAL*   m_pfnCreateObject)()中为什么不能是CObject*   (PASCAL   m_pfnCreateObject)()?? 
      

  3.   

    1、类相当于一个结构,一个类可以定义很多实例,而类中的函数代码只有一份,要让类的函数代码区分是哪个实例,所以要把实例的指针作为参数传给类的函数。2、因为m_pfnCreateObject是指针类型变量,它要储存的是函数的入口地址。更正一下前面的回复,PASCAL参数传递规范是从右到左,函数返回前清栈。VC中已经不在支持__pascal关键字,改用__stdcall。
      

  4.   

    嗯,谢谢cnzdgs现在只剩一个问题了,就是既然这个m_pfnCreateObject是一个指向返回值是CObject* 的函数,那么CObject* (PASCAL* m_pfnCreateObject)()中PASCAL后面的*又有什么用。
      

  5.   

    这行代码是定义函数指针变量,*与前面的pascal没关系,定义指针变量时前面都需要有个*。函数调用都是要调函数的入口地址,所以这种变量必须是指针类型。
      

  6.   

    哦,
    那么CObject*   (PASCAL*   m_pfnCreateObject)();   相当于
    CObject**   (PASCAL   m_pfnCreateObject)();  少了*相当于定义一个指向返回值是CObject(而非CObject *)的函数指针。嗯,那样标准代码那样写貌似容易让人混淆。^_^
      

  7.   

    *必须紧挨在m_pfnCreateObject的前面,定义指针变量就得这样。
    CObject** (PASCAL m_pfnCreateObject)();相当于CObject** PASCAL m_pfnCreateObject();这不是定义指针变量,而是声明函数原形。
      

  8.   

    哦,知道了,CObject**   PASCAL   m_pfnCreateObject()中函数返回值是指向指针的指针。