gpt4 book ai didi

c++ - 函数和函数指针等价

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:07:38 25 4
gpt4 key购买 nike

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

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);
};

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

最佳答案

您不能定义 cb_handler 随心所欲。但是您当然可以根据相同的原型(prototype)声明它们并让编译器检查它。它还会阻止您隐藏指针语义,这是一件好事。方法如下:

  1. 将回调定义为函数类型:

    typedef void callbackb(B *, int param1);
  2. 根据CB类型声明指针和静态成员:

    class A
    {
    callbackb *callme; // The pointer is explicit
    B *parent;
    };

    // Later
    class B
    {
    // ...
    static inline callbackb cb_handler; // This is a function declaration
    };
    // And this is the inline definition, you can put it in a header
    inline void B::cb_handler (B *obj, int param1) { obj->real_handler(param1); }

所以现在 cb_handlercallme 是根据相同的类型声明的。 定义 cb_handler 时需要指定完整的原型(prototype),但它仍然可以是 header 中的inline 类外定义。

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

关于c++ - 函数和函数指针等价,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47172504/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com