【问题标题】:Pass vector of derived class pointers to thread将派生类指针的向量传递给线程
【发布时间】:2016-06-08 13:33:20
【问题描述】:

我有一个带有 Derived1 和 Derived2 派生类的 Base 类和一个 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();
}

【问题讨论】:

  • vector&lt;Base&gt; 不是vector&lt;Base*&gt;
  • 您的示例可能与您拥有的真实代码相比过于简化。为什么您实际上需要 vector&lt;Base&gt;&amp; 类型的 dostuff(),而不是您正在传递的 vector&lt;Base*&gt;
  • 我的消费者类需要接受一系列派生类,因此为了使其适用于任何派生类,我使用了基指针。我在 Ranger * ptrarray[3]; 之前使用了一个指针数组; ptrarray[0]=&derived1; ptrarray[1]=&derived2; ptrarray[2]=&derived3;并使用 ptrarray[i]->variable 在我的消费者中访问。但现在我想让它灵活地处理任意数量的类。
  • @acv17 详细说明 Mike 的评论,注意 Consumer::dostuffpointervec 参数的类型,并与您传递给线程的类型进行比较。
  • @acv17 我仍然不明白为什么doStuff() 需要vector&lt;Base&gt;,以及在那里使用vector&lt;Base*&gt; 无法满足的问题。

标签: c++ multithreading pointers vector


【解决方案1】:

为了使您的示例有效,需要纠正一些错误。

  1. 由于Consumer::doStuff 是一个非静态成员函数,您需要一个Consumer 的实例来运行它。
  2. 由于上述原因,Consumer 需要定义构造函数
  3. doStuff 的签名需要采用Base 指针的(引用a)向量,而不是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();
}

【讨论】:

  • 我编辑了上面的代码给它这个函数体。根据live demo 工作得非常好
  • 你是个传奇!非常感谢你。真的很有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-12-26
  • 2023-04-07
  • 2015-05-03
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多