什么是反射:
常说的反射机制,在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 };
这是个单例类,功能为存哈希表和对外接口生成对象。
未完待续
时间: 2024-10-11 14:36:43