以下に示すように、基本クラスメソッド内からスレッドを生成するときは、純粋仮想メソッド実装を呼び出す必要があります。スレッド内で純粋仮想メソッドを呼び出す
#include <iostream>
class Foo {
private:
std::thread tr;
public:
virtual void baz() = 0;
void foo() {
this->tr = std::thread([=] { this->baz(); });
}
};
class Bar : public Foo {
public:
void baz() {
std::cout << "In baz" << "\n";
}
};
メインクラス...
#include <thread>
#include "test.hpp"
int main(int argc, char* argv[]) {
Bar b;
b.foo();
}
しかし、それはメッセージ
呼ば純粋仮想メソッドアクティブな例外なしで呼び出さ
終了で失敗します10
「純仮想メソッドが呼び出されました」というメッセージは、一部のエラーメッセージにのみ表示されます。私は間違って何をしていますか?それはバーや不適切に破壊されてスレッドに関連して何か?
スレッドにはどこに参加していますか?あなたのメインがすぐに完了するのを止めるのは何ですか? – xaxxon
あなたのプログラムは、ワーカースレッドの 'baz()'呼び出しとメインスレッドの '〜Bar()'呼び出しの間で、 'b'のデータ競争によって未定義の動作を示します。スレッドが 'this-> baz()'に到達する前に 'main'が返って' b'が破棄される可能性が最も高いでしょう。 –
純粋仮想メソッドを呼び出す必要はありません。これは要件ではなく、*問題です。 – EJP