gpt4 book ai didi

c++ - 使用友元类隐藏私有(private)静态回调方法

转载 作者:行者123 更新时间:2023-11-30 02:34:41 24 4
gpt4 key购买 nike

我需要用一些 API 注册一个函数指针表。假设 API 如下所示:

void (*FuncPtr)(void*);
void RegisterCallbacks(FuncPtr const (&callbacks)[10], void* context);

因为我正在编写 OOP 代码,所以我在我的类中创建静态“thunk”方法,这些方法依次调用我类的对象上的方法。我使用 context 指针将指针传递给我的对象。我想在静态初始化时静态分配整个回调指针表。所以我最终得到了这个:

class MyClass
{
public:

static void Thunk (void* context)
{
reinterpret_cast<MyClass*>(context)->Method();
}

void Method ();

//
// More callback thunks and methods...
//

MyClass ()
{
RegisterCallbacks(s_callbackTable, this);
}

private:

static const FuncPtr s_callbackTable[];
}

//
// In the .cpp file:
//
const FuncPtr MyClass::s_callbackTable[] =
{
&MyClass::Thunk,
...
};

这种方法的问题是我需要使 MyClass::Thunk 公开可见,以便静态初始化可以访问它。

编辑:我错了。显然您不需要将其公开。

不过我宁愿不要。我可以想到两种方法来解决这个问题。

哪种方法更好?

  1. 创建一个私有(private)静态方法,并将回调表设为方法内部的静态变量。这样我也可以使用指向私有(private)方法的指针来初始化它。从构造函数内部调用私有(private)静态方法以获取表。

  2. 创建一个包含公共(public)静态 thunk 方法的单独类,并使该类成为 MyClass 的友元。在 MyClass 的 header 中转发声明该类,只是为了允许友元声明。我喜欢这个,因为它还对任何外部消费者完全隐藏了 thunk 方法。不过,我不太确定这样做是否有切实的好处。

    像这样:

    // .h file:

    class MyClassInternals

    class MyClass
    {
    public:

    void Method ();

    private:

    friend class MyClassInternals;

    static const FuncPtr s_callbackTable[];
    }

    // .cpp file:

    class MyClassInternals
    {
    public:

    static void Thunk(void* context)
    {
    reinterpret_cast<MyClass*>(context)->Method();
    }
    }

    const FuncPtr MyClass::s_callbackTable[] =
    {
    &MyClassInternals::Thunk,
    ...
    };

最佳答案

您可以简单地将所有蹦床机制保留在构造函数实现 (.cpp) 中,无需在接口(interface)级别 (.h) 公开有关蹦床的任何内容 ):

MyClass::MyClass() {
struct trampolines {
static void method1(void *ctx) { ((MyClass *)ctx)->method1(); }
static void method2(void *ctx) { ((MyClass *)ctx)->method2(); }
};
static void (*callbacks[])(void*) = { trampolines::method1,
trampolines::method2 };
register_callbacks(callbacks, this);
}

您甚至不需要在 (.h) 中包含使用回调/上下文接口(interface)的 C 库的 header 。这更干净,因为您的模块的客户端将不依赖于那些 C 细节。

关于c++ - 使用友元类隐藏私有(private)静态回调方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34386246/

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