• 【转】C++反射机制的实现


     1 在Java编程中,我们经常要用到反射,通过反射机制实现在配置文件中的灵活配置, 但在C++编程中,对这种方式步提供现有的支持,那么我们怎么才能在配置文件中配置想要调用的对象呢?
     2 
     3 我们的思路是通过对象名称确定对象实例,把对象名和对象实例通过哈希表进行映射,那么我们就可以实现通过对象名称获取对象了。首先定义一个结构:
     4 
     5 struct ClassInfo
     6 
     7 {
     8 public:
     9  
    10  string Type;
    11  funCreateObject Fun;
    12  ClassInfo(string type, funCreateObject fun)
    13  {
    14   Type = type;
    15   Fun = fun;
    16   Register(this);
    17  }
    18 };
    19 
    20 其中Register这样定义
    21 
    22 bool Register(ClassInfo* ci);
    23 
    24 然后定义一个类,头文件如下:
    25 
    26 class AFX_EXT_CLASS DynBase  
    27 {
    28 public:
    29  DynBase();
    30  virtual ~DynBase();
    31 
    32 public
    33  static bool Register(ClassInfo* classInfo);
    34  static DynBase* CreateObject(string type);
    35 
    36 private
    37  static std::map<string,ClassInfo*> m_classInfoMap;
    38 };
    39 
    40 cpp文件如下:
    41 
    42 std::map< string,ClassInfo*> DynBase::m_classInfoMap = std::map< string,ClassInfo*>();
    43 
    44 DynBase::DynBase()
    45 {
    46 
    47 }
    48 
    49 DynBase::~DynBase()
    50 {
    51 
    52 }
    53 
    54 bool DynBase::Register(ClassInfo* classInfo)
    55 
    56  m_classInfoMap[classInfo->Type] = classInfo; 
    57  return true
    58 }
    59 
    60 DynBase* DynBase::CreateObject(string type)
    61 {
    62  if ( m_classInfoMap[type] != NULL ) 
    63  { 
    64   return m_classInfoMap[type]->Fun();
    65  }
    66  return NULL;
    67 }
    68 
    69 那么我们实现映射的类只要继承于DynBase就可以了,比如由一个类CIndustryOperate
    70 
    71 头文件如下
    72 
    73 class CIndustryOperate : public DynBase
    74 {
    75 public:
    76  CIndustryOperate();
    77  virtual ~CIndustryOperate();
    78 
    79  static DynBase* CreateObject(){return new CIndustryOperate();}
    80 
    81 private:
    82  static ClassInfo* m_cInfo;
    83 };
    84 
    85 cpp文件如下:
    86 
    87 ClassInfo* CIndustryOperate::m_cInfo = new ClassInfo("IndustryOperate",(funCreateObject)( CIndustryOperate::CreateObject));
    88 
    89 CIndustryOperate::CIndustryOperate()
    90 {
    91 
    92 }
    93 
    94 CIndustryOperate::~CIndustryOperate()
    95 {
    96 
    97 }

    98 这样CIndustryOperate这个类就真正实现了反射机制!来源:http://blog.csdn.net/iwouldwin/archive/2006/08/24/1113002.aspx

  • 相关阅读:
    dom 获取节点练习
    dom 节点的添加删除 与修改
    dom document属性练习
    ArrayList 去除重复元素
    ud类型聊天
    UDP数据发送
    指定标签所在div在新窗口打开
    日期Calendar
    Seraph介绍
    U盘cmd命令行修复
  • 原文地址:https://www.cnblogs.com/wubiyu/p/1516999.html
Copyright © 2020-2023  润新知