将派生类指针的向量传递给线程

Pass vector of derived class pointers to thread

本文关键字:线程 向量 派生 指针      更新时间:2023-10-16

我有一个包含 Derived1 和 Derived2 派生类的基类和一个 Consumer 类。

我想创建一个包含两个派生类对象的 Base 指针向量,然后传递给使用者类,以便它可以使用

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的签名需要采用(引用a)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();
}