C++反射机制实现

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

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

#pragma once

#include 
#include 
//类对象生成工程

//定义创建对象的函数指针
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 _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(className, fun));
}

void* ClassObjFactroy::getClassObj(std::string className) {
	std::map::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 
#include "GlobalDef.h"

TestA::TestA() {
}

TestA::~TestA() {
}

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

REGISTER_CLASS(TestA)

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

#pragma once

#include 

//注册动作类
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();
	}

输出:
C++反射机制实现_第1张图片

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

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

aaa

你可能感兴趣的:(c++)