動態建立機制
在cruntimeclass結構中加入了兩個元素
cobject* createobject()函式和static cruntimeclass pascal load()
於是又多了兩個巨集
declare_dyncreate巨集和implement_dyncreate巨集
#define declare_dyncreate(class_name)/
declare_dynamic(class_name)/
static cobject* pascal createobject();
#define implement_dyncreate(class_name,base_class_name)/
cobject* pascal class_name::createobject()/
_implement_runtimeclass(class_name,base_class_name,0xffff,/
class_name::createobject)
由上可知,declare_dyncreate是declare_dynamic的增強版,也就是說,擁有動態建立能力的類庫,必然亦有執行時型別識別能力
class cframewnd:public cwnd
;implement_dyncreate(cframewnd,cwnd)
於是被展開如下
class cframewnd:public cwnd
cobject* pascal cframewnd::createobject()
static char _lpszcframewnd="cframewnd";
cruntimeclass cframewnd::classcframewnd=;
staitc afx_classinit _init_cframewnd(&cframewnd::classcframewnd);
cruntimeclass* cframewnd::getruntimeclass() const
這個類的結構中的m_pfncreateobject不再為null,而是被賦予函式指標cframewnd::createobject,而用declare_dynamic來宣告時這個函式指標被賦值null,因為declare_dynamic不具有動態建立功能,所以這個建立函式指標為null
在main()函式中加上這一段**
void main()
cobject* cruntimeclass::createobject()
cobject* pobject=null;
pobject= (*m_pfncreateobject)();
return pobject;
}這個函式先檢查結構中的m_pfncreateobject是否為空,為空則不能建立物件,凡是m_pfncreateobject不為null者,即可動態建立,若不為空,則利用m_pfncreateobject所指向的函式來建立乙個物件的指標。
cruntimeclass* pascalcruntimeclass::load()
trace1("error:class not found:%s /n",szclassname;
return null;
}這個函式首先需要輸入乙個類名,cruntimeclass* pclass這條**宣告了乙個結構的指標,然後利用這個指標來遍歷鍊錶
當找到和這個類名相同的類時,則返回這個類的結構的指標,即pclass。
這其中有幾個creat函式,共有三處,其聯絡如下
在結構中有:
cobject* (pascal* m_pfncreateobject)();稱為函式一
cobject* createobject();函式二
在類中有static cobject* pascal createobject();函式三
其中,結構中的函式一是用來記錄類中的函式三的指標的(正好對應著cruntimeclass記錄類的資訊),因為想要訪問這個類時可以獲得的只有這個類的結構指標而以
函式二則是通過呼叫函式一來實現建立物件的,並且在函式二中還要對m_pfncreateobject進行檢查是否為null
函式三在類定義中,如上面的
cobject* pascal cframewnd::createobject()
返回的是乙個當前類物件的指標,真正建立物件的create函式只有乙個而已,即在函式二中建立
要動態建立乙個類物件,有如下幾個步驟
1.類說明中使用declare_dyncreate(classnmae)巨集;和在類的實現檔案中使用implement_dyncreate(classname,baseclass)巨集;這個巨集完成構造cruntimeclass物件,並加入到鍊錶中。
2、使用時先通過巨集runtime_class得到類的runtime資訊,當獲得乙個類名時,先用類別型錄網判別這個類是否是鍊錶中有的類,若是,就使用cruntimeclass的成員函式createobject建立乙個該類的例項。
3、cobject* pobject = pruntimeclass->createobject();//完成動態建立 非常簡單的過程
深入淺出MFC筆記
深入淺出mfc筆記 一 勿在浮砂築高台 1 並不是擴充套件名為 dll dynamic link library 的才是動態鏈結庫。事實上,exe dll fon mod drv 和.ocx 都是所謂的動態鏈結函式庫。2 windows 程式編譯時需要包含 windows.h 標頭檔案,若需要使用諸...
深入淺出MFC 卷首語
昨晚有點睡不著,想起還有些書還沒看完,於是,起床把 深入淺出mfc 看完了。看這本書斷斷續續也有乙個多月了,我看完之後的第一衝動是找本mfc應用的書來深入熟悉熟悉mfc。因為,看這本書的時候,才發現自己的mfc知識是那麼的貧乏,總有點力不從心的感覺,以至於很多東西都一看而過,根本進入不了思考的階段。...
深入淺出MFC 卷首語
昨晚有點睡不著,想起還有些書還沒看完,於是,起床把 深入淺出mfc 看完了。看這本書斷斷續續也有乙個多月了,我看完之後的第一衝動是找本mfc應用的書來深入熟悉熟悉mfc。因為,看這本書的時候,才發現自己的mfc知識是那麼的貧乏,總有點力不從心的感覺,以至於很多東西都一看而過,根本進入不了思考的階段。...