簡體   English   中英

用虛擬成員啟動線程 function C++

[英]Start thread with virtual member function C++

我有 Base class 和 2 個從 Base class 繼承的其他類。我想創建一個線程,可以在 Derived_* class 中運行覆蓋 function。可以選擇 function 的哪個版本。 當我在示例代碼中創建線程時編譯錯誤。 我應該怎么辦?

更新:正如評論中所指出的,我無法將 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;
}

basestd::unique_ptr<Base>的 object,需要傳Base的 Object。 如果您傳遞 ( *base ),它將調用 Base class 的方法base.get()完成工作並通過傳遞派生的 object ptr 來調用派生的 class 的適當方法。

-- 這也有效:

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

base->print調用派生 class 的適當方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM