C 執行時通過字串動態建立類

2021-06-18 06:55:19 字數 2418 閱讀 2667

有時候我們希望通過乙個字串建立類,可以通過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...