c++实现反射机制

本文介绍了一种使用C++实现的简单反射机制。通过定义特定的宏和模板类,可以实现类的自动注册和按名称创建对象的功能。这种方法利用了C++的静态类型系统和元编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

头文件如下:

/*
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;
对于任意一个对象,都能够调用它的任意一个方法和属性;
这种动态获取的信息以及动态调用对象的方法的功能称为反射机制。
*/

#ifndef _HEADER_H_
#define _HEADER_H_

#include<iostream>
#include<map>			//增加散列表查询
#include<string>

using namespace std;
//////////////////////////////////////////////////////////////////////////

typedef void* (*CreateFuntion)(void);				//定义函数指针CreateFuntion

//保存类和对应创建函数之类的映射
class ClassFactory
{
public:
	/*定义一个静态方法,通过类名查找类*/
	static void* GetClassByName(std::string name)
	{
		/*定义一个散列表的迭代器,用于遍历存放类的散列表*/
		map<string, CreateFuntion>::const_iterator find;

		/*通过迭代器实例化的对象find定位需要查找的类;
		 用find()函数查找,返回的是一个指向该元素的迭代器*/
		find = clsMap().find(name);

		/*如果返回的迭代器不在散列表里,则返回空,否则返回对应的键值(即类对象)*/
		if (find == clsMap().end())
		{
			return NULL;
		}
		else
		{
			return find->second();
		}
	}

	/*定义一个类的静态插入方法*/
	static void RegistClass(string name, CreateFuntion method)
	{
		/*表示已经插入一个类*/
		cout << "Regist Class " << name << endl;
		clsMap().insert(make_pair(name, method));
	}

private:
	/*创建一个map对象的引用函数,返回一个map对象*/
	static map<string, CreateFuntion>& clsMap();
};


map<string, CreateFuntion>& ClassFactory::clsMap()
{
	static map<string, CreateFuntion> *s_clsMap = new map<string, CreateFuntion>();  //只进行一次初始化
	return *s_clsMap;
}


class RegistyClass
{
public:
	RegistyClass(string name, CreateFuntion method)
	{
		/*调用工厂类里的插入类方法!*/
		cout << "RegistyClass Construct!\n";
		ClassFactory::RegistClass(name, method);
	}
};

/*定义模板类*/
template<class T, const char name[]>
class Register
{
public:
	Register()
	{
		const RegistyClass tmp = rc;
	}

	/*定义一个创建插入类对象的方法*/
	static void* CreateInstance()
	{
		return new T;
	}
public:
	static const RegistyClass rc;
};

/*	'/'表示换行符,将一段过长的代码分成几段,下一行紧接当前这一行代码的后面
	##表示强制间断;#表示后面跟着的量转换成字符串
*/
#define DEFINE_CLASS(class_name) \
	char NameArray##class_name[] = #class_name; \
class class_name :public Register<class_name, NameArray##class_name>


#define DEFINE_CLASS_EX(class_name,father_class) \
	char NameArray##class_name[] = #class_name; \
class class_name :public Register<class_name, NameArray##class_name>, public father_class	//表示继承


//////////////////////////////////////////////////////////////////////////

#endif


主文件如下:

#include <string>  
#include <map>  
#include <iostream>
#include "Header.h"


//定义并初始化rc静态变量,通过这一步,静态变量初始化特性,实现类和对应的创建函数的自动注册
template<class T, const char name[]>
const RegistyClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);


//测试类
DEFINE_CLASS(CG)
{
public:
	void Display()
	{
		cout<<"I am Here\n";
	}
};

//另外一个测试注册功能的类
char  className[] = "TestClass";
class TestClass :public Register<TestClass, className>
{
public:
	void test()
	{
		cout<<"Test\n";
	}
private:
	int a;
};


int main(void)
{
	//bug,因为没有执行自动注册,所以tmp为NULL了
	CG* tmp = (CG*)ClassFactory::GetClassByName("CG");
	tmp->Display();

	TestClass *pTmp = (TestClass*)ClassFactory::GetClassByName("TestClass");
	pTmp->test();
	system("pause");
	return 0;
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值