码迷,mamicode.com
首页 > 编程语言 > 详细

c++反射之通过字符串生成对应的类实例

时间:2015-06-12 23:53:55      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:

什么是反射:

常说的反射机制,在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 };

 

这是个单例类,功能为存哈希表和对外接口生成对象。

未完待续

 

c++反射之通过字符串生成对应的类实例

标签:

原文地址:http://www.cnblogs.com/tjuzjf/p/4572763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!