Как создать std :: thread, используя абстрактный класс абстрактный - PullRequest
0 голосов
/ 17 апреля 2020
#include <thread>
#include <utility>
#include <iostream>

class A {
    public :
    virtual void intiliaze(int x,int y) = 0;
};

class B : public A {
    public :
    virtual void intiliaze(int x, int y) {while(true){ std::cout << "Hello World "<< x <<" "<<y<<std::endl;} }
};


int main(int argc, char* argv[]) {
 A* ptrA;
 int x=1;
 int y=2;
 std::thread th(&A::intiliaze,ptrA,x,y);
 th.join();

}

Я получаю сегментацию с указанным кодом. Я пытаюсь создать абстрактный класс с одним производным классом. Использование этого абстрактного класса для запуска потока - мое требование. Сегодня это один производный класс, но в будущем я буду расширяться для других операций

1 Ответ

0 голосов
/ 17 апреля 2020

ptrA - это просто указатель, и ему нужен объект для указания. Поскольку этот указатель создается в stack ( automati c класс хранения ), он может содержать значение мусора (называемое wild указатель ), и когда ваша программа пытается получить доступ к объект (который не существует, потому что вы его создали), используя указатель, вы получаете ошибку сегментации.

Вы можете создать этот объект динамически (используя new) или статически.

Попробуйте это:

A *ptrA = new A();

Или

A obj;
std::thread th(&A::intiliaze, &obj, x, y);
th.join();
...