DECLARE_DYNAMIC和IMPLEMENT_DYNAMIC宏

來源:互聯網
上載者:User

    IMPLEMENT_DYNAMIC是實現“運行時類型識別”宏,與之相對應的是DECLARE_DYNAMIC(聲明“運行時類型識別”宏)。也就是說你在.CPP檔案中如果看見有IMPLEMENT_DYNAMIC,則在.H檔案中必定有DECLARE_DYNAMIC的聲明。
DECLARE_DYNAMIC/DEClARE_DYNAMIC是為了確定運行時對象屬於哪一個類而定義的宏。
DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE是為了“動態建立"類的執行個體而定義的宏。new可以用來建立對象,但不是動態。比如說,你要在程式中實現根據擁護輸入的類名來建立類的執行個體,下面的做法是通不過的:
char szClassName[60];
cin >> szClassName;
CObject* pOb=new szClassName; //通不過
這裡就要用到DEClARE_DYNCREATE/IMPLEMENT_DYNCREATE定義的功能了。

 

定義:

 

//////////////////////////////////////////////////////////////////////////////
// Helper macros for declaring CRuntimeClass compatible classes

#ifdef _AFXDLL
#define DECLARE_DYNAMIC(class_name) /
protected: /
    static CRuntimeClass* PASCAL _GetBaseClass(); /
public: /
    static const CRuntimeClass class##class_name; /
    static CRuntimeClass* PASCAL GetThisClass(); /
    virtual CRuntimeClass* GetRuntimeClass() const; /

#define _DECLARE_DYNAMIC(class_name) /
protected: /
    static CRuntimeClass* PASCAL _GetBaseClass(); /
public: /
    static CRuntimeClass class##class_name; /
    static CRuntimeClass* PASCAL GetThisClass(); /
    virtual CRuntimeClass* GetRuntimeClass() const; /

#else
#define DECLARE_DYNAMIC(class_name) /
public: /
    static const CRuntimeClass class##class_name; /
    virtual CRuntimeClass* GetRuntimeClass() const; /

#define _DECLARE_DYNAMIC(class_name) /
public: /
    static CRuntimeClass class##class_name; /
    virtual CRuntimeClass* GetRuntimeClass() const; /

#endif

 

 

引用:

 

DECLARE_DYNAMIC/IMPLEMENT_DYNAMIC

#define DECLARE_DYNAMIC(class_name)/   
public:/
    static CRuntimeClass class##class_name;/
    //聲明一個類型為CRuntimeClass的靜態public成員變數,變數名是由字串"class"
    //與所指定的類的類名組成。舉例而言,如果你寫DECLARE_DYNAMIC(CMyView),則等於聲明了一個
    // static CRuntimeClass classCMyView靜態變數

    virtual CRuntimeClass* GetRuntimeClass() const;/
    //聲明一個虛函數,函數名為GetRuntimeClass,傳回值為CRuntimeClass類型的指標
    //無參數,並且是個const函數

#define IMPLEMENT_DYNAMIC(class_name,bass_class_name)/
       _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,0xFFFF,NULL)

#define _IMPLEMENT_RUNTIMECLASS(class_name,base_class_name,wSchema,pfnNew)/
    static char _lpsz##class_name[]= #class_name;/
    //定義一個C類型字串靜態變數,變數名由"_lpsz"和指定類的類名組成,變數值為該指定類型的名字
    //比如是CMyView,那麼定義的就是static char _lpszCMyView="CMyView";

    CRuntimeClass class_name::class##class_name = {/
        _lpsz##class_name,sizeof(class_name),wSchema,pfnNew,/
            RUNTIME_CLASS(base_class_name),NULL};/
    //給之前在DECLARE_DYNAMIC裡定義的CRuntimeClass類型的靜態成員變數賦值
    //當然,除最後一個m_pNextClass沒有賦值(賦值為NULL,它由下面的結構處理)

    static AFX_CLASSINIT _init_##class_name(&class_name::class##class_name);/
    //初始化一個名為"_init_##class_name"的AFX_CLASSINIT靜態結構,主要作用是給指定的class_name的
    //class##class_name靜態變數的最後一個成員m_pNextClass賦值,具體見下面解釋AFX_CLASSINIT中

    CRuntimeClass* class_name::GetRuntimeClass() const/
        { return &class_name::class##class_name;}/
    //之前在DECLARE_DYNAMIC裡定義的GetRuntimeClass的實現,很簡單,就一個return語句。

#define RUNTIME_CLASS(class_name)/
        (&class_name::class##class_name)
//這部分之所以單獨define出一個宏,主要是為了方便從某個指定的class直接得到它的CRuntimeclass靜態成員

//以下是解釋AFX_CLASSINIT結構,注意,這不是一個宏
//為了看得更加清楚,我按照struct定義的慣常格式來寫這個struct的定義
struct AFX_CLASSINIT {
    AFX_CLASSINIT(CRuntimeClass *pNewClass);
};

AFX_CLASSINIT::AFX_CLASSINIT(CRuntimeClass *pNewClass)
{
    pNewClass->m_pNextClass = CRuntimeClass::pFirstClass;
    //讓m_pNextClass指向pFirstClass所指的CRuntimeClass變數

    CRuntimeClass::pFirstClass = pNewClass;
    //讓pFirstClass指向pNewClass所指的變數,也就是本class的CRuntimeClass靜態變數
}

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.