有時候我們希望通過乙個字串建立類,可以通過if..else...來實現
string str = "some_class_name";
如
if(str==string("class1"))
else(str ==string("class2"))
else
上面**不僅醜陋,而且難以擴充套件,如果我們希望用乙個統一的基類來呼叫函式,如
string str = "some_class_name";
base* s = create_class(str);
if(s!=null)
s->do();
上面的**就整齊多了,而且以後增加新的類,也不需要修改呼叫的地方。
同時,如果我們定義的這個base* create_class(string name)函式能自動幫我們檢查有沒有乙個類名符合輸入的字串,那就完美了。
我們很容易想到,如果有乙個全域性的map來幫我們儲存,類名字串與對應類的新建函式,
輸入字串,通過map找到每個類都有的過載函式cbase* create() 就可以返回需要的類了。
假設class cbase; class cderived: cbase;
但是,cbase* create()怎麼新建所需要的類呢,可以用下面這個**,在執行的時候new乙個, 這通過過載很容易實現
static cbase *create()
剩下的問題就是怎麼往map裡註冊這個我們的cbase 和 cderived了:可以通過類中宣告乙個輔助類,在輔助類中的建構函式中,插入我們的類名,然後在外類中宣告乙個static的輔助類,就完成了註冊!
上述的**都可以通過巨集展開來完成。
實現**如下,
#include #include #include using namespace std;
// 宣告具有動態建立的基類
#define declear_dyncrt_base(cbase) \
public: \
typedef cbase *(*classgen)(); /* 宣告函式指標*/ \
static cbase *create(const string &class_name) /* 工廠函式 */ \
\ return null; \
} \protected: \
static void register(const string &class_name, classgen class_gen) /* 註冊函式 */ \
\ static std::mapm_class_set; /* 儲存子類資訊 */
// 用於實現基類
#define implement_dyncrt_base(cbase) \
std::mapcbase::m_class_set;
// 用於宣告乙個能夠被動態建立的類(用乙個全域性物件進行註冊)
#define declear_dyncrt_class(cderived, cbase) \
public: \
struct cderived##register /* 輔助類,用於註冊 */ \
\ } \
} ; \
static cbase *create() /* 工廠函式 */ \
\ static struct cderived##register m_t##cderived##register;
// 用於實現乙個能被動態建立的類
#define implement_dyncrt_class(cderived) \
static cderived::cderived##register m_t##cderived##register;
// 宣告基類:
class cbase
};implement_dyncrt_base(cbase)
implement_dyncrt_class(cbase)
//宣告繼承類
class cderived : public cbase
};implement_dyncrt_class(cderived)
//宣告再繼承類
class excderived : public cderived
};implement_dyncrt_class(excderived)
int main()
cbase* base2 = cbase::create("cderived");
if (base2)
cbase* base3 = cbase::create("excderived");
if (base3)
return 0;
}
OC執行時動態建立類
it168技術 在前文 深入淺出cocoa之類與物件 一文中,我已經詳細介紹了objc中的 class 與 object 的概念,今天我們來如何在執行時動態建立類。下面這個函式就是應用前面講到的class,metaclass的概念,在執行時動態建立乙個類。這個函式來自 inside mac os x...
執行時建立類
a.使用objc allocateclasspair建立乙個類class const char classname calculator class kclass objc getclass classname if kclass b.使用class addivar新增乙個成員變數 nsuinteg...
C 在執行時動態建立型別
c 在執行時動態的建立型別,這裡是通過動態生成c 源 然後通過編譯器編譯成程式集的方式實現動態建立型別 public static assembly newassembly n private system.componentmodel.icontainer components null npro...