Я пытаюсь создать класс-оболочку для std :: thread.Этот класс предоставляет метод kick, который запускает поток и вызывает чисто виртуальную функцию.Я использую производный класс для вызова этого метода, и производный класс также реализовал виртуальную функцию.
class Executor
{
public:
// constructor
Executor();
// destructor
~Executor();
// kick thread execution
void Kick();
private:
// thread execution function
virtual void StartExecution() = 0;
// thread handle
std::thread mThreadHandle;
};
Ниже приведена реализация класса исполнителя
Executor::Executor()
{
// Nothing to be done here
}
Executor::~Executor()
{
if (mThreadHandle.joinable())
mThreadHandle.join();
}
void Executor::Kick()
{
// mThreadHandle = std::thread(&Executor::StartExecution, this);
mThreadHandle = std::thread([this] {this->StartExecution();});
}
. Я использую класс Consumer , который наследует этот класс и реализует метод StartExecution.Когда я использую метод kick, он показывает чисто вызванную виртуальную функцию и программа завершается.
std::unique_ptr<Consumer> consumer = std::make_unique<Consumer>();
consumer->Kick();
В методе executor kick.Я добавил точку останова и начал искать, что не так.Он приходит к строке
mThreadHandle = std :: thread ([this] {this-> StartExecution ();});
строка дважды.Первый из-за метода kick, второй - для выполнения лямбда-функции.В первый раз я вижу, что этот указывает на класс потребителей .Но когда дело доходит до лямбда-функции, она испорчена, и vptr указывает на чисто виртуальную функцию.
Я бы интересовался, что в этом не так, а непростые ответы .