C++实现反射机制

来源:互联网 发布:手机网络测试软件 编辑:程序博客网 时间:2024/06/17 20:43
  1. #define DECLARE_CLASS_CREATE(class_name) \  static CObject* CreateClass## class_name ();    #define IMPL_CLASS_CREATE(class_name) \    static CObject* CreateClass## class_name (){ \    return new class_name; \    };      #define REG_CLASS_CREATE(class_name) \    RegisterFactoryCreate(class_name::CreateClass## class_name, #class_name);  

  2. C++并不支持反射机制,只能自己实现。

    如果需要实现字字符串到函数到映射,一定要使用到函数指针

    简单实现反射机制,根据字符串来构造相应到类。主要有以下几点:

    (1) 可以使用map保存字符从到函数指针到映射。

    (2) 工厂类提供字符串与函数指针到注册关系。

    (3) 工厂模式根据不同到字符串构造不同到类对象。

  3. #ifndef __CLASSFACTORY_#define __CLASSFACTORY_#include <iostream>#include<string>#include<map>//定义函数指针typedef void* (*create_fun)();class ClassFactory{public:    ~ClassFactory() {};     //根据类注册时的名字, 创建类实例, 并返回    void* getClassByName(std::string name){        std::map<std::string, create_fun>::iterator it = my_map.find(name);        if (it == my_map.end()) { return NULL; }        create_fun fun = it->second;        if (!fun) { return NULL; }        return fun();    }       //注册类名称与指针函数到映射关系    void registClass(std::string name, create_fun fun){        my_map[name] = fun;    }       //单例模式    static ClassFactory& getInstance(){        static ClassFactory fac;        return fac;    }   private:    ClassFactory() {};  //私有    std::map<std::string, create_fun> my_map;}; #endif#ifndef __TEST_H#define __TEST_H#include <iostream>class Test{public:    Test(){ std::cout << "call Test Constructor fun" << std::endl; }    ~Test(){ std::cout << "call Test Destructor fun" << std::endl; }    void print(){ std::cout << "call Test print fun" << std::endl; }};void* create_Test(){    Test *t = new Test;    return (t == NULL)? NULL:t;}#endif#include "test.h"#include "class_factory.h"int main(){    //注册    ClassFactory::getInstance().registClass("Test", create_Test);    //获取类对象    Test *t = (Test*)ClassFactory::getInstance().getClassByName("Test");    if (!t){        std::cout << "get instnce Test err;" << std::endl;        return 1;    }           t->print();    delete t;    return 0;}