MFC中的動態建立

2022-08-25 19:06:26 字數 2719 閱讀 3876

1、為了能夠動態建立,程式必須維護乙個cruntimeclass的類,當需要去識別乙個類的時候,就依次去查詢這個鍊錶,而這個是通過一組巨集來實現的。因為是乙個鍊錶,所以就需要初始化,這個初始化在cobject中用稍有不同的巨集來實現的。

2、cruntimeclass的結構:

lpcstr m_lpszclassname //類名

int m_nobjectsize                    //類位元組大小,不計算分配的記憶體

uint m_wschema                    //一般為0xffff

cobject* ( pascal* m_pfncreateobject )( )      //乙個函式指標,用來 動態建立物件

cruntimeclass* ( pascal* m_pfn_getbaseclass )( )     //如果是動態載入的話,就指向基類的cruntimeclass物件的指標,否則為null

cruntimeclass* m_pbaseclass              //如果是靜態載入的話,就指向基類的cruntimeclass物件的指標,否則為null

cobject* createobject( );                //乙個函式,用來建立類本身

bool isderivedfrom( const cruntimeclass* pbaseclass) const;//乙個函式,用來判斷是否繼承自某個類

3、這組巨集就是declare_dyncreate(class_name) 與 implement_dyncreate(class_name, base_class_name),其實在這組巨集的內部還有一組巨集,大家可以自己去檢視,其實這裡面的這組巨集是來實現型別識別的。下面將展示將這組巨集展開後的**應該是如何的:

#define declare_dyncreate(class_name)所對應的**

protected:

static cruntimeclass* pascal _getbaseclass();

public:

static const cruntimeclass class##class_name;

static cruntimeclass* pascal getthisclass();

virtual cruntimeclass* getruntimeclass() const;

static cobject* pascal createobject();

#define implement_dyncreate(class_name, base_class_name)所對應的**

cobject* pascal class_name::createobject()

cruntimeclass* pascal class_name::_getbaseclass()

afx_comdat const cruntimeclass class_name::class##class_name = ;

cruntimeclass* pascal class_name::getthisclass()

cruntimeclass* class_name::getruntimeclass() const

假如這裡有乙個cview類

則 #define declare_dyncreate(cview)對應的翻譯後的**為:

protected:

//其中pascal是呼叫協議,此處宣告了乙個函式。

static cruntimeclass* pascal _getbaseclass();

public:

//此處宣告乙個cruntimeclass的物件,來儲存相應的類資訊

static const cruntimeclass classcview;

//宣告乙個獲得類本身的資訊的乙個函式

static cruntimeclass* pascal getthisclass();

//宣告乙個獲得cruntimeclass的結構

virtual cruntimeclass* getruntimeclass() const;

//宣告乙個可以動態建立類本身的函式

static cobject* pascal createobject();

#define implement_dyncreate(cview, cwnd)所對應翻譯後的**為:

//建立類本身的物件

cobject* pascal cview::createobject()

//獲得基類的資訊

cruntimeclass* pascal cview::_getbaseclass()

//宣告乙個結構物件,並初始化

afx_comdat const cruntimeclass cview::classcview = ;

//獲得該類的相應資訊

cruntimeclass* pascal cview::getthisclass()

獲得該類的相應資訊

cruntimeclass* class_name::getruntimeclass() const

關於MFC中的動態物件建立

關於mfc中的物件動態建立 在mfc中,物件的動態建立也要依賴於rtti所建立起來的類別型錄,和動態建立有關的cruntimeclass成員有兩個 cobject pascal m pfncreateobject 指向用於建立物件的函式 cobject createobject 利用m pfncre...

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 這裡在建立的時候一定不能少了...