1. ホーム
  2. C++

非静的メンバ関数の無効な使用

2022-02-08 20:47:26
<パス

ここで、2つのメソッドを持つObjectクラスがあります。

  • Recvは、データを受け取り、それをProcessに渡す役割を担っている
  • プロセスは、データを処理する責任があります

このクラスは、データを受信した後、その背後にある他のビジネス・ロジックをブロックすることなく、データを処理するスレッドを開始するようにしたい。

class Object {
 public:
  void Recv() {
    int a = 2;
    std::thread t(Process, a);
    // Do something
    t.join();
  }

  void Process(int val) {
    std::cout << "Process, val=" << val << "\n";
  }
};

コンパイルエラー error: invalid use of non-static member function

解決方法

アプローチⅠ.

// std::thread t(Process, a); // before modification
std::thread t(&Object::Process, this, a); // after modification

方法2:Processを静的関数として設定する

void Recv() {
  int a = 2;
  std::thread t(&Object::Process, a); // modified
  // Do something
  t.join();
}

static void Process(int val) { // modified
  std::cout << "Process, val=" << val << "\n";
}

参考文献

https://thispointer.com/c11-start-thread-by-member-function-with-arguments/