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

Posted

技术标签:

【中文标题】将派生类指针的向量传递给线程【英文标题】: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; 无法满足的问题。 【参考方案1】:

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

    由于Consumer::doStuff 是一个非静态成员函数,您需要一个Consumer 的实例来运行它。 由于上述原因,Consumer 需要定义构造函数 doStuff 的签名需要采用Base 指针的(引用a)向量,而不是Base 对象 线程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 工作得非常好 你是个传奇!非常感谢你。真的很有帮助。

以上是关于将派生类指针的向量传递给线程的主要内容,如果未能解决你的问题,请参考以下文章

最佳实践:将派生类的向量传递给基类向量上的方法

无法将指向派生类函数的指针传递给基类

c ++:将指针传递给基类时访问派生类方法?

C ++跨类访问基对象向量中的派生对象的引用

在 C++ 中将指向基类的指针传递给派生类的成员函数

制作基类指针的向量并将派生类对象传递给它(多态)