c 反射機制 用類名作變數,動態建立物件

2021-09-29 18:11:43 字數 1787 閱讀 3646

什麼是反射

從建立物件的角度上來看,狹義的說,比如有個 class a ,你能直接 new a() 來建立 物件。但是如果想根據字串 「a」 來建立 class a 的物件,比如 使用 new 「a」 的形式來建立 物件,甚至 「a」 是個變數。 str = 「a」 , new str.

這種把 class 作為變數,又能在執行時建立物件的機制,就叫做反射。

大部分的高階程式語言,先天是支援反射的。用 lua 舉例

local alltypes =

local typeclshash = {}

typeclshash[alltypes.type1] = cls1

typeclshash[alltypes.type2] = cls2

typeclshash[alltypes.type3] = cls3

local thetype = alltypes.type2

local cls = typeclshash[thetype]

local instance = cls:new()

instance:dosth()

如上面的**,可以動態的通過 thetype 變數的值,來選擇 new 哪個 class 的物件。這樣**寫起來就比較靈活,省去了寫一大堆醜陋的 switch case,if/else 。

c++ **示例

需求遊戲裡面有很多ui,是 basemenu 的子類。包括menustageselect, menuhud 等等。希望通過 menumanager::pushmenu() 乙個函式,寫明 menu 的型別,動態建立和現實對應的 menu.

原理由於c++ 語言先天不支援反射機制,因此這種動態 new 不同 class 的例項的機制,在實現起來,必須依賴於函式指標。

用乙個 std::map<>來儲存不同型別的menu 的建立函式,key 是 menu型別,value 是建立的函式指標。

這樣才能實現反射機制,動態建立物件。

實現menumanager.h 定義所有 basemenu子類的列舉

typedef enum

menutype;

menumanager 定義乙個 std::map 成員,用於儲存哪個型別的 menu ,由哪個函式來負責建立。

// registered menus

typedef std::functionmenucreatefunctype;

std::map_registermenus;

每個 menu 都需要提供自己的建立函式。在對應的類裡面,實現乙個 static **** createinstance() 的方法。

例如 menuhud

在 menuhud.h 宣告 static menuhud* createinstance() 函式

class menuhud : public basemenu

每個 basemenu 的子類都需要實現這個靜態函式。

在遊戲初始化時,註冊所有 menu 的建立函式。

void menumanager::registallmenus()

這些準備工作做完之後,就可以在 menumanager::pushmenu(menutype menutype) 函式裡,根據 menu 型別,動態 new 出不同型別的 menu 的例項了。

void menumanager::pushmenu(menutype menutype)

上面 map 的 key 是 menu 的列舉。如果希望用 menu 的類名做變數,只需要把 key 的 列舉,修改為 std::string ,在 registerallmenus() 裡面,用類名作 key 即可

c 反射機制 用類名作變數,動態建立物件

從建立物件的角度上來看,狹義的說,比如有個 class a 你能直接 new a 來建立 物件。但是如果想根據字串 a 來建立 class a 的物件,比如 使用 new a 的形式來建立 物件,甚至 a 是個變數。str a new str.這種把 class 作為變數,又能在執行時建立物件的機制...

C 反射 動態建立物件

上面部落格學習了使用反射檢視型別的資訊,以及使用反射獲取特性物件。下面使用反射來動態建立物件。首先準備乙個test類 public class testclass public testclass int a,int b public int show public static int show ...

Qt程式設計 通過反射機制實現類名資訊動態建立物件技術

根據類名資訊動態建立物件技術,不僅可以降低 的耦合度和複雜性,還可以實現指令碼化程式設計技術,動態解析建立物件,提高記憶體利用率和應用程式靈活性。反射機制框架如下 reflect類宣告如下 typedef qwidget constructor qwidget parent class reflec...