C 動態生成物件

2021-09-07 07:20:23 字數 2593 閱讀 3529

說起c++,很多人都覺著難學,其實我也是這麼覺著的,在這個移動端火到爆的時代,我都想改行了,移動端做東西那都是現有的第三方庫,拿來就可以用,而且穩定性好,開發速度快,而且最關鍵的是出東西。

在談一談動態生成物件,為什麼強大的c++不支援呢?想用這樣功能的人都必須自己實現一套這樣的邏輯。

有時候開發真是有些矛盾,例如:1、實現乙個功能可以使用大量相似的**、也可以使用模板,那我們怎麼選擇呢? 2、如果實現乙個類之後,他有大量的屬性,而且這些屬性都需要set和get方法,那麼我們還是要ctrl +c和ctrl+v嗎?如果有好多這樣的類,還是ctrl+c和ctrl+v嗎?對於第乙個問題,乙個力求上進開發人員,我相信他會選擇模板,第二個問題的答案,也就是我們這篇文章所需要講到的東西,動態生成物件、序列化和反序列化。

其實這個功能實現起來**量還是比較少的,就是使用大量的巨集和工廠模式

1、寫乙個工廠類,專門用於生成物件

1 typedef void * (* createclass)(void);2

3class

cclassfactory

4;

2、然後在寫乙個方便類,這個類僅僅是為了註冊方便,當這個類被宣告的時候,即註冊乙個類到工廠中

1

class

cdynamicclass

28 };

3、2個關鍵的巨集,這兩個巨集乙個是用於cdynamicclass靜態物件的,乙個是用於初始化cdynamicclass物件的,作用請看上一小節,呵呵呵,其實就是註冊巨集的引數類到工廠

1

#define declare_class(classname)\

2 std::string

classname##name;\

3static cdynamicclass *classname##namedc;45

#define implement_class(classname)\

6 cdynamicclass * classname::classname##namedc = new cdynamicclass(#classname, classname::instance);

4、2個屬性巨集,access_inte***ce巨集用於註冊屬性的相關介面,access_register巨集是把屬性名字和物件的屬性呼叫介面記錄起來,方便以後設定屬性

1

#define access_inte***ce(classtype, type, name, describe)\

2public

:\3 std::string m_describe##name =#describe;\

4 inline static

void set##name(cbaseclass * cp, void *value)\

8 inline type get##name(void) const

\11 inline std::string

get##name##describe()

1415

#define access_register(name)\

16 m_propertymap.insert();

5、基類,所有物件的基類,m_propertymap成員是儲存屬性和屬性對於的set介面對

1

class

cbaseclass25

virtual ~cbaseclass() {}67

public

:8 std::mapstring, setvalueproperty>m_propertymap;910

private

:11 };

1

class chelloclass : public

cbaseclass

2;

chelloclass類是乙個測試類,用於測試第三節所寫的動態生成物件是否正確,registproperty介面裡邊是對屬性的註冊

1、測試main函式

1

int main(int argc, char *argv)218

19return

a.exec();

20 }

2、效果結果截圖

圖1 chelloclass測試結果

1

void

dynamicobject::deserialize()

220 tinyxml2::xmlnode * nextnode = element->nextsibling();

21if (nextnode ==nullptr)

2225 element = nextnode->toelement();26}

27}28}

29 }

說到物件序列化,我就覺得有乙個問題比較難搞定,物件包含物件,也就是遞迴序列化,如果涉及到判斷遞迴那麼我們可能還需要自己實現一套結構,用於表示當前物件是否包含其他物件,是否需要繼續遞迴序列化的問題。後面有機會我會對此問題在專門做一篇文章加以解釋。

c++動態生成物件

利用runtime動態生成物件?

利用runtime我們能夠動態生成物件 屬性 方法這特性 假定我們要動態生成dyviewcontroller,並為它建立屬性propertyname 1 物件名 nsstring class dyviewcontroller const char classname class cstringusi...

WPF 動態生成物件屬性 (dynamic)

專案中列行的資料 都需要動態生成 所以考慮到物件繫結 可需要乙個動態生成屬性的意思 缺點 載入速度會慢 很明顯的慢 解決辦法 盡量減輕動態屬性的量 參考文章 這個沒看明白 但是冥冥中讓我覺得 收藏一下以後可能會用 屬性類 想研究明白的 看參考文章 public class nurseschedule...

遍歷節點,生成物件

1 要做的事兒 遍歷div中的input,取input的id為key,取input的value值為key值生成乙個物件,若value為空,則不需要此鍵值對 2 html部分 input div text id input1 value value1 text id input2 value text...