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

这里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条)

报告相同问题?

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效