Как захват преобразовал это в базовом классе в лямбда-функцию? - PullRequest
2 голосов
/ 25 октября 2019

Я хочу закодировать программу, которая реализует базовый класс и производный от него. Мне нужно выполнить поток в базовом классе, который вызывает чистую виртуальную функцию, реализованную в производном классе.

Когда я компилирую и выполняю программу, вместо нее вызывается Base::func() Derivated::func(), и мой сбой программыпотому что он не может выполнять чисто виртуальную функцию. Что мне нужно сделать, чтобы выполнить производную функцию.

Примечание: Может существовать несколько производных классов, поэтому я не могу явно использовать Derivated::func().

class Base {
private:
    std::thread *t = NULL;
    virtual void func() = 0;


public:
    void foo() {
        std::cout << "Base::foo() executed" << std::endl;

        this->t = new std::thread([this]() {
            while (true) {
                func();
            }
        });
    }
};

class Derivated : public Base {
public:
    void func() {
        std::cout << "Derivated::func() executed" << std::endl;
    }
};

int main() {
    Derivated d;
    d.foo();
}

Я ожидаю этот результат:

Base::foo() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
...

Но это выглядит так:

Base::foo() executed
pure virtual method called
terminate called without an active exception
Aborted

Ответы [ 2 ]

3 голосов
/ 25 октября 2019

Пока поток запущен, попытки присоединиться к нему не предпринимаются, поэтому процесс успешно завершается после вызова d.foo(); в main.

Если вы передадите поток получателю в классе Base

std::thread * theThread() { return t; }

в вашем main:

int main() {
    Derivated d;
    d.foo();

    d.theThread()->join();
}

Таким образом основной поток блокируется, а другой поток может продолжать (и включать).

1 голос
/ 25 октября 2019

Вот пример, который работает для меня:

#include <iostream>
#include <memory>
#include <thread>

class Base {
private:
    std::unique_ptr<std::thread> t;
    virtual void func() = 0;

public:
    void foo() {
        std::cout << "Base::foo() executed" << std::endl;    
        t = std::make_unique<std::thread>([this]() {
            for (int i=1; i<= 5; i++) {
                this->func();
            }
        });
        t->join();
    }
};

class Derivated : public Base {
public:
    void func() {
        std::cout << "Derivated::func() executed" << std::endl;
    }
};

int main() {
    Derivated d;
    d.foo();

}

Ouput :

Base::foo() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
Derivated::func() executed
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...