gpt4 book ai didi

c++ - 回调需要const函数,如何传递对象的实例成员

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

我在一个更大的 GTKmm/C++ 应用程序中使用 WebKitGTK+。我正在使用 JavaScriptCore 与其中的 WebKitWebFrame 和 JSContext 进行交互。

我现在卡住了,因为我需要在调用 javascript 函数时与 GTK GUI 组件进行交互。为此我找到了 JSObjectMakeFunctionWithCallback功能。

JSStringRef str = JSStringCreateWithUTF8CString("ClickCallback");
JSObjectRef func = JSObjectMakeFunctionWithCallback(m_jsRef, str, ClickCallback);
JSObjectSetProperty(m_jsRef, JSContextGetGlobalObject(m_jsRef), str, func, kJSPropertyAttributeNone, NULL);
JSStringRelease(str);

其中回调必须定义为带有 def 的静态函数:

static JSValueRef ClickCallback(JSContextRef ctx, JSObjectRef func, JSObjectRef self, size_t argc, const JSValueRef argv[], JSValueRef* exception)

所以一切正常,除了我需要回调中的对象实例返回我需要操作的 GUI 组件。

关于 SO 有很多类似的问题,但大多数都集中在将对象实例传递到回调中。我看不到使用此 API 执行此操作的方法。

有什么想法吗?

最佳答案

回调必须是指向自由函数的指针,因此再多的魔法也无法让您直接传递成员函数。一种常见的解决方案是创建一个中间全局自由函数来保存对象实例:

JSValueRef ClickCallback(...)
{
Foo & obj = getInstance(); // implement this somehow
return obj.click(...);
}

或者,您可以将其设为 GUI 类的静态成员函数。要点是,如果必须将普通函数指针传递给 API,则必须单独获取实例引用并自行调用成员函数。

关于c++ - 回调需要const函数,如何传递对象的实例成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7372590/

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