c++实现反射类(三)
不是直接new一个对应的对象返回,原因是直接new是不可以的。例如如下定义
#define REFLECT(name) \
Any GetInstanceByName(const string& class_name) {
return Any(new name);
}
如果是多个类使用的话,那么就会出现多个函数的定义。如果也借助工厂类的实现,如下实现:
#define REFLECT(name) \
Any GetInstanceByName##name(const string& class_name) {
return Any(new name);
}
这样是不会出现重复定义了,但是这样在生产新的对象时需要指定特定的函数,这不又回到原点了吗?因此工厂类充当的是个中介的角色,我们可以保存工厂类,然后根据名称寻找特定的工厂类来生成对应的对象。
注:
为什么需要使用函数添加工厂类?因为在程序中,全局空间中只能是变量的声明和定义,而不能是语句,例如:
可以这样写:
int a = 10;
int main() {}
但是不能这样写:
int a;
a = 10;
int main() {}
需要注意的知识点:
工厂模式;
全局变量的定义需要注意,不能定义在头文件中(当如,如果经过特殊处理,例如使用#ifndef保护另说);
Any类型的实现;(准备写另外一篇文章来探讨其实现细节)
宏的定义以及使用;(基本覆盖了宏的所有知识)
全局变量构造函数与__attribute__((constructor))的执行顺序;(调试了很久)
__attribute__((constructor))的问题;(编译器有关,放在函数定义前或定义后)
全局空间只能是声明或者定义,不能是语句;
static在函数中的使用;
全局变量类的定义与使用。