将派生类指针的向量传递给线程
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<Base>
不是vector<Base*>
您的示例可能与您拥有的真实代码相比过于简化。为什么您实际上需要 vector<Base>&
类型的 dostuff()
,而不是您正在传递的 vector<Base*>
?
我的消费者类需要接受一系列派生类,因此为了使其适用于任何派生类,我使用了基指针。我在 Ranger * ptrarray[3]; 之前使用了一个指针数组; ptrarray[0]=&derived1; ptrarray[1]=&derived2; ptrarray[2]=&derived3;并使用 ptrarray[i]->variable 在我的消费者中访问。但现在我想让它灵活地处理任意数量的类。
@acv17 详细说明 Mike 的评论,注意 Consumer::dostuff
的 pointervec
参数的类型,并与您传递给线程的类型进行比较。
@acv17 我仍然不明白为什么doStuff()
需要vector<Base>
,以及在那里使用vector<Base*>
无法满足的问题。
【参考方案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 工作得非常好 你是个传奇!非常感谢你。真的很有帮助。以上是关于将派生类指针的向量传递给线程的主要内容,如果未能解决你的问题,请参考以下文章