C++ 反射机制详解及实例代码反射机制详解及实例代码
C++ 反射机制反射机制
一.前言:
Java有着一个非常突出的动态相关机制:Reflection,用在Java身上指的是我们可以于运行时加载、探知、使用编译期间完全
未知的classes。换句话说,Java程序可以加载一个运行时才得知名称的class,获悉其完整构造(但不包括methods定义),
并生成其对象实体、或对其fields设值、或唤起其methods。然而C++是不支持反射机制,虽然C++有RTTI(运行时类型识别)。
但是想要实现C++对象序列化,序列化就是存储到磁盘上,将对象变成一定格式的二进制编码,然后要用的时候再将保存在磁
盘上的二进制编码转化成一个内存中的对象,这个过程中总是需要有一个指示来告诉编译器要生成什么样的对象,最简单的方
式当然就是类名了,例如:将一个ClassXXX对象存储到磁盘上,再从磁盘读取的时候让编译器根据“ClassXXX”名称来new一
个对象。
ClassT* obj = FactoryCreate("ClassT");
类似于以上的语法,虽然C++没有自带的语法可以实现,但是我们可以自己通过其他方法来实现。(由于本人能力有限,所以
该篇博客只是讲解如何简单的实现这个反射机制,而对C++中拥有这个反射机制是否有必要不做任何讨论。当然,如果博客中
有什么地方说的有错误还望大家可以在下面评论指出谢谢)
二二.实现:实现:
1.我们很容易可以想到可以使用简单工厂模式来实现这个效果:比如
class Object
{
public:
virtual string ToString() = 0;
};
这个是所有需要实现反射机制的类需要继承的基类,然后派生出来的类只需要再实现这个ToString即可。例如:
class MyClass :public Object
{
public:
virtual string ToString(){ return "MyClass"; }
};
然后就是用于产生对象的工厂。
Object* FactoryCreat(const string& className)
{
if (className == "ClassA")
return new ClassA;
else if (className == "ClassB")
return new ClassB;
else if(className == "ClassC")
return new ClassC;
else if(className == "ClassD")
return new ClassD;
else if(className == "ClassE")
return new ClassE;
...
}
我们使用就可以这样:
int main()
{
Object* obj = FactoryCreat("MyClass");
cout << obj->ToString();
delete obj;
return 0;
}
我们使用简单工厂模式感觉好像是解决了问题,可以实现用字符串去new一个对应的对象,但是假如我们要新建一个类或者修
改一个类,那么这个FactoryCreat都要进行修改。十分不利于维护。所以我们需要换一个方式来处理。
2.工厂模式结合回调机制。工厂模式结合回调机制。
首先我们要梳理一下这个方法的基本脉络:
评论0