MFC解密(3) 動態建立

2021-09-30 04:26:00 字數 1805 閱讀 2307

關鍵字:

declare_dyncreate

implement_dyncreate

1. mfc通過上面2個巨集為我們包裝了 物件 的建立過程

可見,declare_dyncreate實際上包含了2步

1. declare_dynamic    實現rtti

2. createobject()           實現物件動態建立

2. 實際上動態建立也是通過cruntimeclass來實現的

接上段程式

pfnnew作為引數傳給cruntimeclass 物件,cruntimeclass中有乙個函式指標來記錄我們自己類的建立函式的位址

cobject (* m_pfncreateobject)();

這樣我們只需要呼叫cruntimeclass::m_pfncreateobject就可以實現對我們自己類的建立。

3. cruntimeclass為我們建立我們自己類物件的實際過程

cruntimeclass裡有2個輔助函式幫助我們進行建立

因為mfc層次結構是樹狀的,並不是直線的。如果我們只有乙個m_pbaseclass指標,它只會沿著基類上去,會漏掉其它分支。在動態建立時,必需要檢查整個鍊錶,看有多少個要動態建立的物件,即是說要從表頭(pfirstclass)開始一直遍歷到表尾(m_pnextclass=null),不能漏掉乙個cruntimeclass物件。

所以每當有乙個新的鍊錶元素要加入鍊錶的時候,我們要做的就是使新的鍊錶元素成為表頭,並且m_pnextclass指向原來鍊錶的表頭,即像下面那樣(當然,這些不需要我們操心,是rtti巨集幫助我們完成的):

pnewclass->m_pnextclass=cruntimeclass::pfirstclass;//新元素的m_pnextclass指標指向想加入的鍊錶的表頭。

cruntimeclass::pfirstclass=pnewclass;//鍊錶的頭指標指向剛插入的新元素。

好了,有了上面的鍊錶,我們就可以分析動態建立了。

有一了張有類名,函式指標,動態建立函式的鍊錶,我們就可以知道應該按什麼步驟去動態建立了:

1、獲得一要動態建立的類的類名(假設為a)。

2、將a跟鍊錶裡面每個元素的m_lpszclassname指向的類名作比較。

3、若找到跟a相同的類名就返回a所屬的cruntimeclass元素的指標。

4、判斷m_pfncreateobject是否有指向建立函式,有則建立物件,並返回該物件。**演示如下(以下兩個函式都是cruntimeclass類函式):

4. runtime_class

該巨集幫助我們通過類名得到類的cruntimeclass物件的名字

通過這個巨集我們可以直接使用

runtime_class(class_name)->createobject();

來建立物件

5. 實際使用

1、定義乙個不帶引數的建構函式(預設建構函式);因為我們是用createobject()動態建立,它只有一條語句就是return new ***,不帶任何引數。所以我們要有乙個無參建構函式。

2、類說明中使用declare_dyncreate(classnmae)巨集;和在類的實現檔案中使用implement_dyncreate(classname,baseclass)巨集;這個巨集完成構造cruntimeclass物件,並加入到鍊錶中。

3、使用時先通過巨集runtime_class得到類的runtime資訊,然後使用cruntimeclass的成員函式createobject建立乙個該類的例項。

4、cobject* pobject = pruntimeclass->createobject();//完成動態建立。

MFC動態建立物件

define implement dyncreate class name,base class name cobject pascal class name createobject implement runtimeclass class name,base class name,0xffff,...

MFC 動態建立Picture Control

1.首先定義乙個靜態的cstatic 的指標 cstatic ppicturecontrol null ppicturecontrol create t ws child ws visible ss bitmap,crect 20,10,80,40 this,12345 這裡在建立的時候一定不能少了...

MFC 動態建立控制項

知識點 cedit create dwstyle引數 動態建立edit控制項 crect類 一 cedit create函式 cedit create bool create dword dwstyle,const rect rect,cwnd pparentwnd,uint nid 以下風格在 e...