使用类方法实现std :: thread时出错

时间:2019-02-18 02:23:46

标签: c++ stdthread

我用一个名为myshape的类方法编写了一个简单的类display_area(),该方法打印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();
}

1 个答案:

答案 0 :(得分:0)

首先,永远不要“将实例创建为指针”。有时,实例是动态分配的(默认情况下,此机制为您提供了一个播放指针)。但是,即使它们不是,它们仍然有一个地址,并且您仍然可以获得代表该地址的指针。

我们使用std::thread的构造函数的方式与要调用其成员函数的对象的存储持续时间无关。

因此,实际上,您应该遵循相同的说明:

std::thread t1(&myshape::display_area, &s, 100);

(在cppreference的页面上有此功能的an example of exactly this。)

作为困惑的一个补充点,此构造函数允许您传递引用而不是指针,因此,如果您更喜欢它,以下内容也将很好用:

std::thread t1(&myshape::display_area, s, 100);