我一直在玩c ++ 11线程,并且有一些问题。人们说当你在线程中调用类成员函数时,这个函数必须是static
。但似乎这不是真的。例如,我发现了这个:
class bar
{ public:
void foo() {std::out << "Hello" << std::endl};
}
int main()
{
std::thread t0(&bar::foo, bar());
t0.join();
}
上面的代码工作正常。似乎成员函数在c ++ 11标准中不必是静态的。我想知道我的理解是否属实。另一个问题是,如果我只是用“static void foo()”修改“void foo()”,我会收到一个错误:
error: no type named 'type' in 'class std::result_of<void (*(bar))()>'
我不明白这一点,但似乎这是因为我调用线程的方式不正确。我在调用线程中的函数时非常困惑。例如,我发现在上面的例子中调用相同的成员函数的另一种方法是
int main()
{ bar A;
std::thread t0(&bar::foo, &A);
}
它也有效!我不知道这两种方式的区别。似乎第一种方式是每次调用foo()时都会执行类的构造函数,而在第二种方式中它不会执行。真的吗?此外,当在另一个类成员函数中调用成员函数时,必须传递'this'。
我搜索互联网,我所能找到的只是例子,而没有解释论证的含义。任何人都可以告诉我如何在std::thread
?
答案 0 :(得分:1)
std::thread t0(&bar::foo)
使用静态foo
方法非常好。
此外,当提出问题时,请考虑提供正常工作的代码,而不是文字您刚才在本网站的文本字段中实际写的内容。
对您的问题的简短回答:为非静态类方法提供this
参数,或者如果它是静态类方法则不提供它。
但是,如果你不明白,你必须知道一件事:
每个类方法都与this
对象一起使用,这意味着指向当前对象的常量指针。在绑定你的函数时(我想在std::thread
内完全绑定工作),第一个参数必须是你想要调用的方法的对象。否则它没有意义:你正试图用什么对象做某事呢? this
存在于类的每个非静态方法中,隐含地,由方法的第一个参数存在。