使用 class 方法实现 std::thread 时出错
Error implementing std::thread with a class method
我写了一个简单的 class、myshape
,带有一个名为 display_area()
的 class 方法,打印了 N
个矩形的面积用户将提供 N
的次数。我希望这个函数独立地在一个线程中 运行 。然而,在实现线程时我得到错误提示
error: invalid use of non-static member function
std::thread t1(s.display_area, 100);
看过相关讨论C++ std::thread and method class!与我的情况不同,对象实例是作为指针创建的,无法解决我的问题。我在下面附加我的代码以供参考。感谢任何帮助。
#include <iostream>
#include <thread>
using namespace std;
class myshape{
protected:
double height;
double width;
public:
myshape(double h, double w) {height = h; width = w;}
void display_area(int num_loop) {
for (int i = 0; i < num_loop; i++) {
cout << "Area: " << height*width << endl;
}
}
};
int main(int argc, char** argv)
{
myshape s(5, 2);
s.print_descpirtion();
std::thread t1(s.display_area, 100);
t1.join();
}
首先,实例永远不会 "created as a pointer"。有时实例是动态分配的(这种机制默认为您提供一个指针)。但是,即使它们不是,它们仍然有一个地址,您仍然可以获得一个代表该地址的指针。
我们使用std::thread
的构造函数的方式与您要调用其成员函数的对象的存储时间无关。
所以,确实,您应该遵循相同的说明:
std::thread t1(&myshape::display_area, &s, 100);
(在 cppreference 的页面上有 an example of exactly this 这个功能。)
作为一个额外的混淆点,这个构造函数 也 允许你传递一个引用而不是一个指针,所以如果你更习惯下面的方法也可以它:
std::thread t1(&myshape::display_area, s, 100);
我写了一个简单的 class、myshape
,带有一个名为 display_area()
的 class 方法,打印了 N
个矩形的面积用户将提供 N
的次数。我希望这个函数独立地在一个线程中 运行 。然而,在实现线程时我得到错误提示
error: invalid use of non-static member function
std::thread t1(s.display_area, 100);
看过相关讨论C++ std::thread and method class!与我的情况不同,对象实例是作为指针创建的,无法解决我的问题。我在下面附加我的代码以供参考。感谢任何帮助。
#include <iostream>
#include <thread>
using namespace std;
class myshape{
protected:
double height;
double width;
public:
myshape(double h, double w) {height = h; width = w;}
void display_area(int num_loop) {
for (int i = 0; i < num_loop; i++) {
cout << "Area: " << height*width << endl;
}
}
};
int main(int argc, char** argv)
{
myshape s(5, 2);
s.print_descpirtion();
std::thread t1(s.display_area, 100);
t1.join();
}
首先,实例永远不会 "created as a pointer"。有时实例是动态分配的(这种机制默认为您提供一个指针)。但是,即使它们不是,它们仍然有一个地址,您仍然可以获得一个代表该地址的指针。
我们使用std::thread
的构造函数的方式与您要调用其成员函数的对象的存储时间无关。
所以,确实,您应该遵循相同的说明:
std::thread t1(&myshape::display_area, &s, 100);
(在 cppreference 的页面上有 an example of exactly this 这个功能。)
作为一个额外的混淆点,这个构造函数 也 允许你传递一个引用而不是一个指针,所以如果你更习惯下面的方法也可以它:
std::thread t1(&myshape::display_area, s, 100);