C++反射机制的实现

本文介绍了如何在C++中实现反射机制,通过分析和改造网上找到的代码,详细解释了注册类、工厂方法和静态成员变量在反射中的作用。讨论了编译器隐式声明默认构造函数的条件,并探讨了多重继承可能导致的问题。最后,作者提供了自己的改进方案,取消了多重继承以提高代码安全性。

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

.NET、C#这些语言都在内部实现了反射技术,因此用起来很是得心应手,但是C++则没有实现反射,因此只有自己写程序实现了。首先感谢网络上的师傅们,要我自己实现怕是很困难,毕竟我也是刚开始学习,网上的教程很多,但是有一些很依赖具体的程序环境,如gcc等,我觉得很不爽,因此都没有参考。我要感谢http://blog.youkuaiyun.com/wrq147/article/details/5603262 这个文章的作者,我是看他的程序实现了反射机制,然后在他上面的情况下进行了一点点修改。如果有不足的情况请大家见谅,大家一起学习学习哈。首先我贴出我整理好的这位原作者的代码。

代码如下 reflection.h

#ifndef _REFLECTION_H_
#define _REFLECTION_H_

#include <iostream>
#include <map>

typedef void* (*CreateFuntion)(void);
/*
以下为工厂类,用来创建类和注册类
*/
class ClassFactory
{
public:
	static void* 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();
		}
	}

	static void RegistClass(std::string name, CreateFuntion method) {
		m_clsMap.insert(std::make_pair(name, method));
	}
private:
	static std::map<std::string, CreateFuntion> m_clsMap;
};

std::map<std::string, CreateFuntion> ClassFactory::m_clsMap;  


class RegistyClass {
public:
	RegistyClass(std::string name,CreateFuntion method) {
		ClassFactory::RegistClass(name,method);
	}
};

template<class T,const char name[]>
class Register {
public:
	Register() {
		//这个一定要加,因为编译器不保证程序开始时就初始化变量rc
		const RegistyClass tmp=rc;
	}

	static void* CreateInstance() {
		return new T;
	}
public:
	static const RegistyClass rc;
};

template<class T,const char name[]>
const RegistyClass Register<T, name>::rc(name, Register<T, name>::CreateInstance);


#define DEFINE_CLASS(class_name) \
	char NameArray##class_name[] = #class_name;\
class class_name:public Regi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值