gpt4 book ai didi

c++ - 作为类成员的函数指针

转载 作者:太空狗 更新时间:2023-10-29 20:42:34 25 4
gpt4 key购买 nike

关于 C++ 中的函数指针,类函数和全局函数有什么区别?我问的是,如果函数是类成员,Windows CreateThread 方法似乎不接受线程代码进入的函数。

当它是一个全局方法时,我可以将函数(线程代码进入)传递给 CreateThread 消息,但是一旦我让它成为一个类的成员,我就会收到错误“argument of type [method layout] is与 LPTHREAD_START_ROUTINE 类型的参数不兼容”。 ClassName::* 现在在中间;这对它有影响吗?

解决这个问题的方法是什么?

最佳答案

成员函数指针 ( DWORD(WINAPI Foo::*)(LPVOID) ) 与函数指针 ( DWORD(WINAPI *)(LPVOID) ) 是不同的类型。成员函数有一个隐藏的 this参数,导致签名不匹配。

最简单的方法是使用 C++11 的 <thread> header :

struct Foo {
void threadProc() {}
};

int main() {
Foo foo;
std::thread t{&Foo::threadProc, foo, /*other arguments to threadProc*/};
t.join();
}

如果你不得不求助于CreateThread , 利用 void *传递实例的参数:

struct Foo {
DWORD threadProc() {...}
};

extern "C" DWORD WINAPI proxyThreadProc(LPVOID userData) {
auto foo = static_cast<Foo *>(userData);
if (foo) {foo->threadProc();}
}

int main() {
Foo foo;
CreateThread(..., proxyThreadProc, &foo, ...);
}

你类的那个现在几乎可以是你想要的任何东西(比如 std::function )并且仍然有效,只要它在代理过程中使用正确的参数调用。

关于c++ - 作为类成员的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18229638/

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