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