C++反照机制
C++反射机制
代码如下:
这个反射机制,我也是从网上看到的,
http://blog.****.net/wrq147/article/details/5603262,
但就是不明白,为什么不支持继承啊?!!!
------解决方案--------------------
c++执行期间的反射能力接近零,顶多只能模拟一个
代码如下:
class Base
{
public:
Base(){}
virtual ~Base(){}
virtual void Display() {}
};
#ifndef REFLEX_H
#define REFLEX_H
#include <iostream>
#include <string>
#include <map>
#include "Base.h"
using namespace std;
#define DEFINE_CLASS(class_name) \
char NameArray[]=#class_name;\
class class_name : public Register<class_name,NameArray>
#define DEFINE_CLASS_EX(class_name,father_class) \
char NameArray[]=#class_name;\
class class_name : public Register<class_name,NameArray>,public father_class
typedef void* (*CreateFuntion)(void);
class ClassFactory
{
public:
static void* GetClassByName(std::string name);
static void RegistClass(std::string name,CreateFuntion method);
private:
static std::map<std::string,CreateFuntion> m_clsMap;
};
class RegistyClass
{
public:
RegistyClass(std::string name,CreateFuntion method);
};
/*基类*/
template<class T,const char name[]>
class Register
{
public:
Register();
static void* CreateInstance();
public:
static const RegistyClass rc;
};
#endif
#include "reflex.h"
std::map<std::string,CreateFuntion> ClassFactory::m_clsMap;
void* ClassFactory::GetClassByName(std::string name)
{
std::map<std::string,CreateFuntion>::const_iterator find;
find = m_clsMap.find(name);
if(find == m_clsMap.end())
{
return NULL;
}
else
{
return find->second();
}
}
void ClassFactory::RegistClass(std::string name,CreateFuntion method)
{
m_clsMap.insert(std::make_pair(name,method));
}
RegistyClass::RegistyClass(std::string name,CreateFuntion method)
{
ClassFactory::RegistClass(name,method);
}
template<class T,const char name[]>
Register<T,name>::Register()
{
const RegistyClass tmp = rc;
}
template<class T,const char name[]>
void* Register<T,name>::CreateInstance()
{
return new T;
}
template<class T,const char name[]>
const RegistyClass Register<T,name>::rc(name,Register<T,name>::CreateInstance);
#include "reflex.h"
DEFINE_CLASS_EX(CG,Base)
{
public:
void Display()
{
printf("fff\n");
}
};
int main()
{
Base* tmp = (Base*)ClassFactory::GetClassByName("CG");
tmp->Display();
return 0;
}
这个反射机制,我也是从网上看到的,
http://blog.****.net/wrq147/article/details/5603262,
但就是不明白,为什么不支持继承啊?!!!
------解决方案--------------------
c++执行期间的反射能力接近零,顶多只能模拟一个