什麼是反射
從建立物件的角度上來看,狹義的說,比如有個 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...