xacdy2020
2021-01-08 16:03
采纳率: 50%
浏览 111

这里C++的typedef和define如何理解?

为简单起见,我用伪代码示意如下:

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个啊?这里为何只有一个?

代码运作良好,读起来这部分比较困难。请赐教!

 

  • 写回答
  • 好问题 提建议
  • 追加酬金
  • 关注问题
  • 收藏
  • 邀请回答

7条回答 默认 最新

  • 幻灰龙 2021-01-08 17:29
    已采纳


    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++的宏定义规则,实际代码会被展开,看上去想解决的的是部分绑定的问题,但是做法不够现代,可以直接用这组现代的风格:

    1. [1] https://en.cppreference.com/w/cpp/language/pointer
    2. [2] https://en.cppreference.com/w/cpp/utility/functional/mem_fn
    3. [3] https://en.cppreference.com/w/cpp/utility/functional/bind
    评论
    解决 无用
    打赏 举报
查看更多回答(6条)

相关推荐 更多相似问题