Ошибка реализации std :: thread с помощью метода класса - PullRequest
0 голосов
/ 18 февраля 2019

Я написал простой класс, myshape, с методом класса с именем display_area(), который печатает область прямоугольника в течение N числа раз, когда N будет предоставлен пользователем.Я хочу, чтобы эта функция запускалась в потоке независимо.Однако при реализации многопоточности я получаю сообщение об ошибке

error: invalid use of non-static member function  
        std::thread t1(s.display_area, 100);

Я видел соответствующее обсуждение C ++ std :: thread и класса метода !где экземпляры объекта были созданы как указатель в отличие от моего случая и не смогли решить мою проблему.Я добавляю мой код ниже для справки.Любая помощь приветствуется.

#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 голосов
/ 18 февраля 2019

Во-первых, экземпляры никогда не "создаются как указатель".Иногда экземпляры распределяются динамически (и этот механизм дает вам указатель для игры по умолчанию).Но даже если их нет, у них все еще есть адрес, и вы все равно можете получить указатель, который представляет этот адрес.

То, как мы используем конструктор std::thread, не имеет ничего общего с хранилищемПродолжительность объекта, функцию-член которого вы хотите вызвать.

Итак, действительно, вы должны следовать тем же инструкциям:

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

(есть пример именно этого на странице cppreference для этой функции.)

В качестве дополнительной путаницы этот конструктор также позволяет вам передавать ссылку вместо указателя, поэтому следующее также будет хорошо, есливам удобнее:

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