關鍵字:
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...