为简单起见,我用伪代码示意如下:
namespace ns1{
class nsc1
{
};
}
class gc2
{
};
typedef void (ns1::nsc1::*ClickHandler)(ns1::nsc1*,gc2*);
#define BTN_HANDLER(_SelObj) (ClickHandler)(&_SelObj)
1、typedef部分,定义的函数指针前面用ns1::nsc1修饰是什么目的?
2、#define部分,BTN_HANDLER定义为ClickHandler(&_SelObj),可是函数ClickHandler的参数是2个啊?这里为何只有一个?
代码运作良好,读起来这部分比较困难。请赐教!
1. 首先,ns1是C++的名称空间修饰,就是一个限定作用,可先忽略
typedef void (nsc1::*ClickHandler)(nsc1*,gc2*);
2. 其次,typedef是给后面的类型一个别名,例如
typedef int MyInt; // 给int类型定义一个别名
typedef (*MyFunc)(int,int); // 定义一个函数指针的别名
void test(int,int){
}
MyFunc f = &test; // 这样函数指针就可以被赋值,test函数的参数和返回值类型与MyFunc匹配
3. C++有成员函数,成员函数也是一种函数,当然我们也可以对它用typedef定义其函数指针的别名,例如
class Test{
void echo(int){}
}
typedef (Test::*FnDump)(int); // 定义一个属于Test类的成员的函数指针,别名dumpMember
FnDump f = &Test::echo; // 于是类Test的成员函数echo,其指针可以被赋值给FnDump类型的实例。
但是怎么调用呢?echo是一个成员函数,隐藏了第一个指针this,需要这么调用
this->*f(10);
注意如果不加typedef,FnDump就会只是个变量:
(Test::*FnDump)(int); // FnDump是个成员函数指针变量
typedef (Test::*FnDump)(int); // FnDump是个成员函数指针的类型
4. 所以问题里的typedef,给类nsc1的成员函数定义了一个函数指针类型,类型别名是ClickHandler
nsc1里符合该函数指针参数类型和返回值类型的成员函数指针,都可以被赋值为ClickHandler的变量
下面的define遵守C/C++的宏定义规则,实际代码会被展开,看上去想解决的的是部分绑定的问题,但是做法不够现代,可以直接用这组现代的风格:
typedef 生成的是新类型。代码预编译之后使用的地方一样。
define 是宏定义,一对一替换,预编译之后将会被替换。
前者好用,后者易读。
宏定义看起来像是类型强转。
你似乎没有看清我的问题啊
补上:define部分应该是理解了,这里是一个强制类型转换,将宏BTN_HANDLER的参数_SelObj强制转换为typedef中定义的函数指针类型。
第一个问题仍然不明白,我试图将ClickHandler前面的ns1::nsc1::除掉,结果出错。
函数指针添加域说明是标准格式。
建议查看C++标准,typedef定义成员函数类型。我记得这是语法规定。
编译角度来解释不太好解释这个东西。
typedef 相当于自定义一个新的类型,并用这个类型进行声明变量,这个在c语言中多用于定义一个结构体的类型,
define 宏实际类似于给某个已经存在的类型起了一个别名
解释的非常清晰,感谢!