提问人:DNRN 提问时间:7/6/2023 更新时间:7/6/2023 访问量:82
C++ 中的回调
Callback in C++
问:
我正在处理一个wasm项目,我需要在C++头文件中定义一个empscripten获取回调,因为我需要更新成员变量。 有人可以帮我如何定义 C++ 的回调函数,我能够在其中更新本地成员变量吗?
在MyClass.CPP中,我有以下方法
void MyClass::Register()
{
emscripten_fetch_attr_t attr;
emscripten_fetch_attr_init(&attr);
attr.onsuccess = DownloadSucceeded;
attr.onerror = DownloadFailed;
}
我已经在我的头文件中定义了 和。DownloadSucceeded
DownloadFailed
void DownloadSucceeded(emscripten_fetch_t* fetch)
{
printf("Finished downloading %llu bytes from URL %s.\n", fetch->numBytes, fetch->url);
emscripten_fetch_close(fetch); // Free data associated with the fetch.
m_unlocked = true;
}
void DownloadFailed(emscripten_fetch_t* fetch)
{
printf("Downloading %s failed, HTTP failure status code: %d.\n", fetch->url, fetch->status);
emscripten_fetch_close(fetch); // Also free data on failure.
m_unlocked = false;
}
我收到以下异常:
reference to non-static member function must be called
从上面的异常中,我试图发送参考,但这似乎也不起作用。如果某个聪明的人能解释为什么以及如何解决这个问题,我将不胜感激!
我幼稚的参考示例也不起作用:
attr.onsuccess = &DetectorBridge::DownloadSucceeded;
给:
assigning to 'void (*)(struct emscripten_fetch_t *)' from incompatible type 'void (mynamespace::MyClass::*)(emscripten_fetch_t *)'
答:
1赞
john
7/6/2023
#1
查看 emscriptem 源,您似乎需要做这样的事情,您将指针保存到 emscriptem 为此目的设计的字段。MyClass
void MyClass::Register()
{
emscripten_fetch_attr_t attr;
emscripten_fetch_attr_init(&attr);
attr.onsuccess = DownloadSucceeded;
attr.onerror = DownloadFailed;
attr.userData = this; // save this object
}
然后,当您收到回调时,使用保存的指针来修改变量
void DownloadSucceeded(emscripten_fetch_t* fetch)
{
printf("Finished downloading %llu bytes from URL %s.\n",
fetch->numBytes, fetch->url);
static_cast<MyClass*>(fetch->userData)->m_unlocked = true; // get saved object
emscripten_fetch_close(fetch); // Free data associated with the fetch.
}
我忽略了访问成员变量的问题,但如果这是一个问题,则有通常的解决方案。m_unlocked
评论
1赞
n. m. could be an AI
7/6/2023
您需要是静态成员或非成员函数。DownloadSucceeded
评论
void *userData
m_locked
*void userData
userData
emscripten
需要 C 样式的回调。不能将非静态成员函数作为 C 样式回调传递。