我是靠谱客的博主 可靠枫叶,最近开发中收集的这篇文章主要介绍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

最后

以上就是可靠枫叶为你收集整理的c++反射之通过字符串生成对应的类实例的全部内容,希望文章能够帮你解决c++反射之通过字符串生成对应的类实例所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部