函数指针作为类的成员

Gho*_*ost 3 c++ pointers class function

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

当它是一个全局方法时,我可以将函数(线程代码进入)传递给CreateThread消息,但是一旦我使它成为类的成员我得到错误"类型[方法布局]的参数与参数不兼容类型为LPTHREAD_START_ROUTINE".ClassName ::*现在位于中间; 这会影响吗?

这是怎么回事?

chr*_*ris 5

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

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

struct Foo {
    void threadProc() {}
};

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

如果你不得不诉诸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, ...);
}
Run Code Online (Sandbox Code Playgroud)

你的班级中的那个现在可以是你想要的任何东西(比如a std::function)并且仍然可以工作,只要在代理程序中使用正确的参数调用它.