工作中有需求根据类名实例化这个类,故此实现了反射机制,简要代码如下:
class Class;
class MidWare{
public:
virtual void work()=0;
};
template
class ObjectFactory {
public:
static MidWare *create(){
return new T();
}
};
class Class {
private:
MidWare *(*factory)(void);
static mapclassMap;
string name;
Class() {
}
public:
static void createSceneByName(const char *className);
template static Class *Register(string className) {
if (classMap.count(className) == 0) {
Class *cls = new Class();
cls->factory = &ObjectFactory::create;
cls->name = className;
classMap = cls;
}
return classMap;
}
static Class *forName(string clsName);
MidWare *newInstace() const;
string getName() const;
virtual ~Class();
};
```
原理是使用map将类名和响应类创建的方法的函数指针关联。
使用时注册这个类并继承MidWare这个类然后实现其纯虚函数work即可(实际上就是在map中新增一个关联关系)通过类名创建实例。
注册实例代码如下:
const Class *Test3Class::theClass = Class::Register("Test3Class");
```
现在的问题是上面注册的这段代码有时候可以有时候不可以,具体表现就是比如有文件A和B,放在A里面就行B里面就不行
报错信息如下请看附件,是一张截图。
有哪位大神遇到过这样的问题,帮助我一下。。。啊啊啊啊,快疯掉了