C++ 反射机制详解及实例代码

2020-01-06 16:26:37王冬梅

1.继承Object类。
2.重载一个CreatObject()函数,里面 return  new 自身类。
3.拥有一个classInfo的成员并且用类名和CreatObject初始化。

满足以上三个要求的类我们就可以利用反射机制来创建对象了。我们可以看下面的例子:


class B : public Object 
{ 
public: 
  B(){ cout << hex << (long)this << " B constructor!" << endl; } 
  ~B(){ cout << hex << (long)this << " B destructor!" << endl; } 
  virtual ClassInfo* GetClassInfo() const{ return &ms_classinfo; } 
  static Object* CreateObject() { return new B; } 
protected: 
  static ClassInfo ms_classinfo; 
}; 
ClassInfo B::ms_classinfo("B", B::CreateObject); 

使用的话我们就只需要调用Object::CreatObject(string) 传入类名即可。


int main() 
{ 
  Object* obj = Object::CreateObject("B"); 
  delete obj; 
  return 0; 
} 

基本上反射机制的功能就实现了,而且使用回调注册在后期拓展上也容易维护。

三.使用宏简化代码:

其实大家发现,因为我们要让类支持反射那么就要满足我们上面的那三个要求,但是每个类都要写这样相似的东西。仔细一看,包括函数申da's明、函数定义、函数注册,每个类的代码除了类名外其它都是一模一样的,有没有简单的方法呢?
那就是使用宏。


//Reflex.h 
 
//类申明中添加 classInfo 属性 和 CreatObject、GetClassInfo 方法 
#define DECLARE_CLASS(name)  
  protected:  
    static ClassInfo ms_classinfo;  
  public:  
    virtual ClassInfo* GetClassInfo() const;  
    static Object* CreateObject(); 
 
//实现CreatObject 和 GetClassInfo 的两个方法 
#define IMPLEMENT_CLASS_COMMON(name,func)  
  ClassInfo name::ms_classinfo((#name),  
       (ObjectConstructorFn) func);  
              
  ClassInfo *name::GetClassInfo() const  
    {return &name::ms_classinfo;} 
 
//classInfo 属性的初始化 
#define IMPLEMENT_CLASS(name)       
  IMPLEMENT_CLASS_COMMON(name,name::CreateObject)  
  Object* name::CreateObject()           
    { return new name;} 

有了宏替换后,我们定义一个新的类。

只需要在类定义中添加 DECLARE_CLASS(classname) 实现中添加IMPLEMENT_CLASS(classname)就可以让这个类实现反射了。

例如我们上面的类B就可以这样写:


class B : public Object 
{ 
  DECLARE_CLASS(B) 
public: 
  B(){ cout << hex << (long)this << " B constructor!" << endl; } 
  ~B(){ cout << hex << (long)this << " B destructor!" << endl; } 
}; 
IMPLEMENT_CLASS(B) 

这样不管以后需要添加、修改什么功能都只需要修改宏就可以了而不需要每个类每个类去添加、修改方法。