簡體   English   中英

將派生類指針的矢量傳遞給線程

[英]Pass vector of derived class pointers to thread

我有一個帶有Derived1和Derived2派生類的基類以及一個Consumer類。

我想用兩個派生類對象創建一個基指針向量,然后傳遞給使用者類,以便它可以使用以下方法獲取派生類詳細信息

pointervec.at(0).i

我已經堅持了很長時間,無法使其正常工作。 這是我所擁有的簡化版本。 我擔心圍繞創建向量,將其傳遞到線程並訪問不同索引的語法。

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

using namespace std;

class Base
{
public:
    Base() {};
    void dosomething() {cout<<i<<endl;}
    int i;
};

class Derived1 : public Base
{
public:
    Derived1() {i = 5;}
};

class Derived2 : public Base
{
public:
    Derived2() {i = 10;}
};

class Consumer
{
public:
    Consumer();
    void dostuff( vector<Base> &pointervec) {cout<<5<<endl;}
};

int main( int argc, char ** argv )
{
    Derived1 derived1;
    Derived2 derived2;

    vector<Base*>pointervec;
    pointervec.push_back(&derived1);
    pointervec.push_back(&derived2);

    std::thread t1(&Derived1::dosomething, &derived1);
    std::thread t2(&Derived2::dosomething, &derived2);
    std::thread t3(&Consumer::dostuff, ref(pointervec));

    t1.join();
    t2.join();
    t3.join();
}

為了使您的示例正常工作,需要糾正一些錯誤。

  1. 由於Consumer::doStuff是一個非靜態成員函數,因此您需要一個Consumer實例來對其運行。
  2. 由於上述原因, Consumer需要定義的構造函數
  3. doStuff的簽名需要采用(指向) Base指針(而不是Base對象)的向量
  4. 線程t3需要Consumer所述實例作為其第一個轉發參數(以提供this參數)。

最終工作代碼:

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

using namespace std;

class Base
{
public:
    Base() {};
    void dosomething() {cout<<i<<endl;}
    int i;
};

class Derived1 : public Base
{
public:
    Derived1() {i = 5;}
};

class Derived2 : public Base
{
public:
    Derived2() {i = 10;}
};

class Consumer
{
public:
    Consumer() {}
    void dostuff( vector<Base*> &pointervec) {cout<<pointervec.at(0)->i<<endl;}
};

int main( int argc, char ** argv )
{
    Derived1 derived1;
    Derived2 derived2;

    Consumer c;
    vector<Base*>pointervec;
    pointervec.push_back(&derived1);
    pointervec.push_back(&derived2);

    std::thread t1(&Derived1::dosomething, &derived1);
    std::thread t2(&Derived2::dosomething, &derived2);
    std::thread t3(&Consumer::dostuff, &c, ref(pointervec));

    t1.join();
    t2.join();
    t3.join();
}

暫無
暫無

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

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