首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数和函数指针等价

函数和函数指针等价
EN

Stack Overflow用户
提问于 2017-11-08 05:55:32
回答 1查看 60关注 0票数 2

我有两个类;A类通知B类一些事件。

代码语言:javascript
复制
typedef void (*callbackb) (B *, int param1);

class A
{
  callbackb callme;
  B *parent;
};

class B
{
  A ai;
  void set_cb() { ai.callme = cb_handler; }
  static void cb_handler (B *obj, int param1) { obj->real_handler(param1); }
  void real_handler(int param1);
};

有两个等价的声明,即回调b和cb_handler,但其中一个是函数指针,另一个是函数。是否可以更改其中一个或两者,以便两者都链接到单个原型声明?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-08 06:02:16

您不能按照需要定义 cb_handler。但是,您当然可以基于相同的原型声明它们,并让编译器检查它。它还阻止您隐藏指针语义,这是一件好事。下面是操作步骤:

  1. 将回调定义为函数类型为: (B *,int param1);
  2. 根据CB类型声明指针和静态成员: 类A{ callbackb *callme;//指针是显式B*父类;};//后期类B{ // .静态内联回调b cb_handler;//这是一个函数声明};//这是内联定义,您可以将它放在标题内联B::cb_handler (B *obj,int param1) {obj->B::cb_handler(Param1)中;}

因此,现在cb_handlercallme是按照相同的类型声明的。在定义cb_handler时,您需要指定完整的原型,但它仍然可以是头中的inline类外定义。

编译器将检查cb_handler的定义是否与声明匹配,因此如果cb_handlercallbackb不同,则会通知您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47172504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档