簡單來說,本文實現了在c++中由類名字串動態建立物件的功能。
設計目的
實現c++物件的動態繫結。
開發專案時,我們有需要將類名資訊放在配置檔案中,以在執行時,依據讀取的類名資訊實現對應物件的建立,從而提高程式功能和配置的靈活性。
c++提供了動態繫結特性,但貌似沒有提供現成的根據類名進行動態繫結的介面(也多半是我讀書太少沒發現)。在mfc10中,使用cruntimeclass以及配套的資訊提供了此功能,但對問題領域的實現來說,多半不應該需要mfc,而是基於c++來形成多ide開發或跨平台的實現方案。
此外,本文也算是對單件模式進行乙個示例。
設計方案
在程式初始化時,使用雙構造方式完成類名資訊與類建立操作的關聯與儲存,雙構造保證單件模式的物件工廠類——cobjectfactory的靜態物件總是先於為其他被收集類而定義的全域性結構物件被建立,從而保證實現類資訊收集。
借鑑mfc的設計方式,定義了一對宣告與實現巨集:declare_core_dyncreate和implemente_core_dyncreate。declare_core_dyncreate完成類的靜態建立操作的宣告,implemente_core_dyncreate完成類名資訊的收集與類的靜態建立操作的定義。
使用方法
將源程式(源程式是個.h檔案)包含到目標工程中後,在需要動態繫結的類的宣告中,包含declare_core_dyncreate,對應類的實現檔案中包含implemente_core_dyncreate,這樣,便為此類提供了依據其類名字串資訊建立對應類物件的能力。
從某處讀取到類名後,使用cobjectfactory::createobject方法,將類名作為其引數,便可返回建立好的類物件指標。
最後,用完物件後,記得釋放資源。釋放資源操作由使用者來完成,本動態繫結設計並未實現。
使用方法真的很簡單,懶得貼demo了。
源程式
#ifndef _h_coredyncreate_332a5f22_79b2_440b_a57b_a88f8d654010
#define _h_coredyncreate_332a5f22_79b2_440b_a57b_a88f8d654010
#pragma warning(disable:4786)
#include #include class cobjectfactory
public:
static cobjectfactory* getinstance()
public:
void addclassinfo(std::string strclassname, pcreateobject pcreateobj)
void* createobject(std::string strclassname)
return 0;
}};struct tclassinfo
};#define declare_core_dyncreate(classname) \
public: \
static void* createobject();
#define implemente_core_dyncreate(classname) \
void* classname::createobject() \
tclassinfo _init##classname(#classname, classname::createobject);
#endif //_h_coredyncreate_332a5f22_79b2_440b_a57b_a88f8d654010
c 的動態繫結與靜態繫結
十分淺顯易懂。為了支援c 的多型性,才用了動態繫結和靜態繫結。理解他們的區別有助於更好的理解多型性,以及在程式設計的過程中避免犯錯誤,需要理解四個名詞 1 物件的靜態型別 物件在宣告時採用的型別。是在編譯期確定的。2 物件的動態型別 目前所指物件的型別。是在執行期決定的。物件的動態型別可以更改,但是...
C 中的動態繫結與靜態繫結
c 中,非虛函式都是靜態繫結,而虛函式卻是動態繫結。重點 建構函式和析構函式中呼叫虛函式,虛函式是靜態繫結的,本類只會呼叫類本身的虛函式。為了能夠更清楚地了解靜態繫結與動態繫結,我們可以看下面這個例子 include using namespace std class b 那麼兩次呼叫fun 函式是...
基於Android的記事本APP設計與實現
摘 要 隨著智慧型手機發展越來越迅猛,手持智慧型手機的人越來越多,尤其是 合理的android手機。人們已經習慣用手機來處理一些事情,尤其用手機的記事本或者標籤來記錄日常工作的事物,在這種情況下,開發一款基於android平台的簡單實用的記事本很有必要,可以在很大程度上方便人們的生活。此次課題研究的...