C++反射机制实现

Java中有反射机制,但是C++中并没有这种机制。如何动态的通过字符串创建相应的实例对象,就是利用了反射的一种方式。

1.首先需要把字符串标识和对应的创建函数保存起来,以方便可以通过相应字符串实现对象的创建。

#pragma once

#include <map>
#include <string>
//类对象生成工程

//定义创建对象的函数指针
typedef void* (*createObject)();

#define ObjFactroy() (ClassObjFactroy::getInstance())

class ClassObjFactroy {
private:
	ClassObjFactroy();
	static ClassObjFactroy* _instance;
public:
	~ClassObjFactroy();
	static ClassObjFactroy* getInstance();

	void registerClass(std::string className, createObject fun);

	void* getClassObj(std::string className);
private:
	std::map<std::string, createObject> _createObjMap;//保存字符串和创建对象的函数指针
};
#include "ClassObjFactroy.h"

ClassObjFactroy* ClassObjFactroy::_instance = new ClassObjFactroy;

ClassObjFactroy::ClassObjFactroy() {
}

ClassObjFactroy::~ClassObjFactroy() {
}

ClassObjFactroy* ClassObjFactroy::getInstance() {
	return _instance;
}

void ClassObjFactroy::registerClass(std::string className, createObject fun) {
	_createObjMap.insert(std::pair<std::string, createObject>(className, fun));
}

void* ClassObjFactroy::getClassObj(std::string className) {
	std::map<std::string, createObject>::const_iterator iter;
	iter = _createObjMap.find(className);
	if (iter == _createObjMap.end()) {
		return nullptr;
	} else {
		return iter->second();
	}
}

2.定义所有对象的基类

//基类

class BaseObject {
public:
	BaseObject();
	~BaseObject();

	virtual void printMsg() = 0;
};

3.定义子类

#pragma once
#include "BaseObject.h"

class TestA :public BaseObject {
public:
	TestA();
	~TestA();

	virtual void printMsg()override;
};
#include "TestA.h"
#include <QDebug>
#include "GlobalDef.h"

TestA::TestA() {
}

TestA::~TestA() {
}

void TestA::printMsg() {
	qDebug() << QStringLiteral("TestA对象输出信息");
}

REGISTER_CLASS(TestA)

4.把创建子类的方法,注册到管理类中,通过全局变量的方式实现这个过程

#pragma once

#include <string>

//注册动作类
typedef void* (*createObject)();

class RegisterClassAction {
public:
	RegisterClassAction(std::string className, createObject fun);//在构造函数中实现注册
	~RegisterClassAction();
};
#include "RegisterClassAction.h"
#include "ClassObjFactroy.h"

RegisterClassAction::RegisterClassAction(std::string className, createObject fun) {
	ObjFactroy()->registerClass(className, fun);
}


RegisterClassAction::~RegisterClassAction() {
}

5.定义注册宏

#pragma once
#include "RegisterClassAction.h"

#define REGISTER_CLASS(className)\
className* create##className(){\
        return new className;\
}\
RegisterClassAction regClass(#className, (createObject)create##className);

6.调用过程:

	BaseObject* obj = (TestA*)ObjFactroy()->getClassObj("TestA");
	if (obj !=nullptr){
		obj->printMsg();
	}

输出:
在这里插入图片描述

以上就实现了通过类名可以动态的创建类对象。

注意:需要注册的类必须继承于同一个父类,目的是:可以通过调用父类的函数接口进而调用子类的函数接口。

aaa

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值