天天看點

c++反射之通過字元串生成對應的類執行個體

什麼是反射:

常說的反射機制,在Java,ObjectC上支援的很完善,以Java為例:JAVA反射機制是在運作狀态中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動态擷取的資訊以及動态調用對象的方法的功能稱為java語言的反射機制。

以上是“官方”定義,用搜尋引擎搜反射機制,出來的都是類似的說法。

本文重點:

在c++裡通過一個類名字元串來生成對應的對象(下一篇是通過函數名字元串來調用對象對應的方法),這是反射機制很好的應用,且用途很廣。比如,常見的根據不同的字元串生成不同的對象,首先想到的是用switch語句建立簡單工廠,或者通過觀察者模式,但是二者寫起來都比較費勁,且不易維護(簡單工廠的弊端本來就是對修改開放,違背開閉原則)。如果語言有這樣的功能,給程式字元串“ClassA”,就能自動生成ClassA對象,那該多友善啊。

核心思路:

将類的名字和類的生成對象的方法(如create方法)的指針,組成key-value,存放在哈希表裡,通過查找名字得到對應方法的指針,執行就可以生成對象。這樣說,有點類似于簡單工廠,但是可以利用類的靜态成員變量(程式一運作就配置設定記憶體并初始化,生命周期和程式一緻),在定義時自動加入map。省去了新加一個類,就要往工廠裡添加一條case的步驟。但是缺點很明顯,就是所有對象的生成方法都必須是一樣的(如都是create()),而且額外開銷了哈希表,存所有類名和他們生成方法的指針。用空間換取了編碼時的便利,其實也沒什麼不好。

知識點:

函數指針,單例模式,類的靜态成員變量,宏定義

1 class ClassFactory
 2 {
 3 public:
 4     ClassFactory() {};
 5     virtual ~ClassFactory() {};
 6     
 7     void *createObject(std::string className);
 8     void registClass(std::string className, createMethod method);
 9     static ClassFactory *getInstance();
10     
11 private:
12     std::map<std::string, createMethod> _classMap;
13 };      

這是個單例類,功能為存哈希表和對外接口生成對象。

未完待續

轉載于:https://www.cnblogs.com/tjuzjf/p/4572763.html