宏定义 与 c++/java 反射

#define LOG( format, … ) printf( format, __VA_ARGS__ )
LOG( “%s %d”, str, count );
__VA_ARGS__是系统预定义宏,被自动替换为参数列表。

如定义好#define STRING(x) #x之后,下面二条语句就等价。
char *pChar = “hello”;
char *pChar = STRING(hello);
还有一个#@是加单引号(Charizing Operator)
#define makechar(x) #@x
char ch = makechar(b);与char ch = ‘b';等价。

Java:
反射这个特性在C++中是没有的。所谓反射,自己的认为就是通过一个名字就可创建、调用、获取信息等一系列的操作,这个在脚本语言里面是比较常见的,COM组件也类似,知道个ID名,就可以做很多的工作了。
看看JAVA中的描述:
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法;这种动态获取的信息以及动态调用对象的方法的功能称为JAVA语言的反射机制。
JAVA反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法;生成动态代理。
反射发挥威力的场所:1.序列化(Serialization)和数据绑定(Data Binding)。2.远程方法调用(Remote Method Invocation RMI)。3.对象/关系数据映射(E/R Mapping)。
虽然没有,但既然我们用的是C++,总是会有办法的~~

c++
ITEM1:动态创建
在实现反射的过程中的第一步要做的可能就是动态创建了,就是用一个类的名字就可以得到这个类的创建函数,从而进行对象的创建。要实现这些,首先对于要反射的类得提供一个能创建自己的回调函数,我们可以使用这个函数来创建这个类的对象,这样,也使得创建活动内聚,减少将来不必要的修改。同时,为了我们可以通过类名获取刚才所说的回调函数,我们就需要一种全局储存结构来保存创建函数和对应类名的映射关系。
这个回调函数就可以是这样的:
static CBaseClass* ClassName::CreateClassName (){
return new ClassName;
};
在MFC中,我们常使用DECLARE_DYNCREATE宏,这个宏可以使每个CObject的派生类的对象具有运行时动态创建的能力。那么我们也可以使用宏来简化上面实现函数的方法,如下:
#define DEFINE_DYN _CREATE(class_name) /
static CBaseClass * CreateClass## class_name ();

#define IMPLIMENT_DYN _CREATE(class_name) /
static CBaseClass * CreateClass## class_name (){ /
return new class_name; /
};
分别放入需要创建的类的H文件和CPP文件就可以了~,当然,仅仅这样还不可以,因为我们不但要可以低耦合地创建对象,还需要把对象的创建方法和类名的映射存储起来,那么我们就还需要一个宏:
#define REGISTER_CLASS (class_name) /
RegisterFactory (class_name::CreateClass## class_name, #class_name);
在RegisterFactory函数中,我们需要一种结构,比如Map,将对应关系存储起来,以备以后的使用。
当然,我们也可以使用另一种方法,我们可以创建一个一般类,这个类可以进行映射关系的存储,提取,运行,或者动态映射的功能,我们让我们的反射类继承这个一般类就可以了。