【发布时间】: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*>无法满足的问题。
标签: c++ multithreading pointers vector