我有类对象Chat *p
,我想在其上运行方法Foo(int num)
(例如,通常由p -> Foo(3)
运行)。
我写了这段代码:
std::thread F(&Chat::Foo, 4);
但是,它不会编译给我,我也看到错误,因为我无法将p -> Foo
放入其中(而不是&Chat::Foo
...)
如何正确运行此代码?
谢谢!
答案 0 :(得分:1)
对象方法实际工作方式的答案。当您调用p->foo(3)
编译器将其翻译成的内容时,粗略地说,Chat::foo(p, 3)
。 P
始终作为隐藏参数传递给函数的任何调用。 C ++没有告诉你这个,你实际上不能调用Chat::foo(p, 3)
,这是不允许的,但它大致是现实中的事情。
任何成员函数中可用的变量this
只是作为隐藏的第一个参数传入的地址,并且您在函数中访问的任何成员变量都引用隐藏的第一个参数。所以...为了将任何成员函数作为线程的起点调用,您需要做的是将指针作为第一个参数传递给对象。我相信,std::thread F(&Chat::Foo, p, 4);
将正确地启动该线程。