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 };

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

未完待续

时间: 2024-10-11 14:36:43

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

JSON C# Class Generator ---由json字符串生成C#实体类的工具

json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果. http://jsonclassgenerator.codeplex.com/  ----开源的winform工具. http://json2csharp.com/    同时推荐 另一款在线转化工具,大家看名字就知道了.

json字符串生成C#实体类的工具

转载:http://www.cnblogs.com/finesite/archive/2011/07/31/2122984.html json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果. http://jsonclassgenerator.codeplex.com/  ----

由json字符串生成C#实体类的工具

json作为互联网上轻量便捷的数据传输格式,越来越受到重视.但在服务器端编程过程中,我们常常希望能通过智能提示来提高编码效率.JSON C# Class Generator 能将json格式所表示的Javascript对象转化成强类型的C#实体类,来实现减少代码输入的效果. http://jsonclassgenerator.codeplex.com/  ----开源的winform工具. http://json2csharp.com/---一款在线转化工具,大家看名字就知道了.

Javascript 解析字符串生成 XML DOM 对象。

Javascript 接收字符串生成 XML DOM 对象.实测对 Firefox .IE6 有效.可用于解析 ajax 的服务器响应结果,也可用于解析自定义字符串.?1. [代码]函数   ppt模版  /** * Parses DOM from XML text.<br /> *  * @author Typhoon.Free.Wolf * @version 2014-02-28_15-51 * @param blDebugFlag *      - Debug flag: true, f

用字符串生成二维码

需要导入Zxing.jar包 import android.graphics.Bitmap; import com.google.zxing.BarcodeFormat; import com.google.zxing.MultiFormatWriter; import com.google.zxing.WriterException; import com.google.zxing.common.BitMatrix; public class ZxingCode { /** * 用字符串生成二

随机字符串生成

function TfrmPWGenerate.btnGenerateClick(Sender: TObject): string; {max length of generated password}const  intMAX_PW_LEN = 10;var  i: Byte;  s: string;begin  {if you want to use the 'A..Z' characters}  if cbAZ.Checked then    s := 'ABCDEFGHIJKLMNOPQ

根据字符串生成MD5

1 import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { // MD5変換 public static String Md5(String str) { if (str != null && !str.equals("")) { try { MessageDigest md5 = MessageDigest.getInst

根据字符串生成类---类的类型.self---根据字符串创建控制器对象

swift和OC一样,都是通过NSClassFromString,根据一个字符串,生成相应的类. 1 // UITabBarButton是系统的私有类,不能直接使用 2 // if btn.isKind(of: UITabBarButton.self){ 3 if btn.isKind(of: NSClassFromString("UITabBarButton")!){ 4 // NSClassFromString:根据字符串取相应的类 5 } 取一个类的类型,oc中是[类 class

西安邀请赛D题 字符串生成题 深搜

很抱歉,学校的OJ并不支持外网,而且还没有加上题目... 题意是说,求一个字符串,他的所有长度超过4的子串都是唯一的. 然后我当时是想aaaa, baaa, caaa, daaa...这样巴拉巴拉一直生成下去的,后来发现真的是想的太天真了,因为前面的两个长度为4的子串("aaaabaaa")的存在,直接封杀了3个子串("aaab", "aaba", "abaa").然后我就想记录状态去试着暴力去跑一个生成机.其实也很简单,就是