用虚成员函数启动线程C++

knsnq2tg  于 2023-01-10  发布在  其他
关注(0)|答案(1)|浏览(106)

我有基类和2个从基类继承的其他类。我想创建一个线程,可以运行Derived_* 类中的覆盖函数。可以选择函数的哪个版本。当我创建示例代码中的线程时,编译错误。我应该怎么做?
更新:正如在注解中指出的,我不能将unique_ptr传递给std::thread构造函数。使用std::move或std::async都可以。谢谢你的帮助!

#include <string>
#include <iostream>
#include <thread>
#include <vector>

class Base{
public:
    virtual void print(const std::vector<int> &vec);
};

void Base::print(const std::vector<int> &vec){
    std::cout << "run Base::print" << std::endl;
}

class Derived_1: public Base{
public:    
    virtual void print(const std::vector<int> &vec) override;
};

void Derived_1::print(const std::vector<int> &vec){
    std::cout << "run Derived_1::print" << std::endl;
    for(int i = 0; i < (vec.size()); i++){
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;
}

class Derived_2: public Base{
public:    
    virtual void print(const std::vector<int> &vec) override;
};

void Derived_2::print(const std::vector<int> &vec){
    std::cout << "run Derived_2::print" << std::endl;
    for(int i = 0; i < (vec.size()); i++){
        std::cout << vec[i] << " ";
    }
    std::cout << std::endl;
}

int main(){
    int classType = 0;
    std::unique_ptr<Base> base;
    std::vector<int> vec{0, 1, 2};

    if(classType){
        base = std::make_unique<Derived_1>();
    }else{
        base = std::make_unique<Derived_2>();
    }

    std::thread th(&Base::print, base, std::ref(vec));
    th.join();

    return 0;
}
2wnc66cl

2wnc66cl1#

basestd::unique_ptr<Base>的对象,你需要传递Base的Object。如果你传递(*base),它将调用基类的方法。base.get()完成这项工作,并通过传递派生对象ptr来调用派生类的适当方法。
--这也适用:

std::future<void> f1 = std::async(std::launch::async,[&]{base->print(std::ref(vec));});
f1.get();

base->print调用派生类的相应方法。

相关问题