用工厂模式复制C++派生类中的线程[复制]

这个问题在这里已经有答案了
C++11带有类成员函数[duplicate]的多线程

(3个答案)
已于9天前关闭

社区在9天前审查了是否重新打开此问题,并将其关闭:

原始关闭原因未解决

我正在考虑使用工厂模式并在实例上生成线程

下面是我的代码,我得到以下错误:

错误:非静态成员函数“virtual void base::threadFunction()”的使用无效
75 |线程t1(myClass1->线程函数);
#包括<记忆>
#包括<iostream>
#包括<螺纹>
使用名称空间std;
枚举类枚举
{
类别1,
类别2num
};
阶级基础
{
公众:
基本(类枚举类类型)
{
此->classType=classType;
}
classEnum getClassEnum(){返回类类型;}
虚空threadFunction()=0;
私人:
类枚举类类型;
};
类别1:公共基地
{
公众:
类别1():
基本(类别枚举)
{
}
void threadFunction()
{
cout“你好,来自class1\n”;;
//使用唯一变量调用uniqueFunction
}
私人:
//唯一变量类型和函数
};
类别2:公共基地
{
公众:
类别2():
基本(class2Enum)
{
}
void threadFunction()
{
cout“Hello from class2\n”;;
//使用唯一变量调用uniqueFunction
}
私人:
//唯一变量类型和函数
};
阶级工厂
{
公众:
创建共享类型(std::classr)
{
开关(类类型)
{
案例类别枚举:
返回使共享<class1>();
案例类别2编号:
返回使共享<类别2>();
违约:
返回NULL;
}
}
};
int main()
{
shared_ptr<base>myClass1=工厂::创建(ClassEnum);
shared_ptr<base>myClass2=工厂::创建(class2Enum);
线程t1(myClass1->threadFunction);
线程t2(myClass2->线程函数);
t1.join();
t2.连接();
返回0;
}

现在,我看到错误表明我使用的是非静态方法,但将base更改为static意味着我无法再访问成员变量,并且派生函数也没有被调用(这很有意义)

那么我应该如何生成这些线程呢

由于这些函数是非静态的(即在对象上调用它们),因此线程需要对象来调用它们。更改此项:

线程t1(myClass1->threadFunction);
线程t2(myClass2->线程函数);

为此:

线程t1(&base::threadFunction,myClass1.get());
线程t2(&base::threadFunction,myClass2.get());

这告诉线程对传递的对象调用threadFunction

注意语法的变化(&),我们调用base版本-这是因为我们正在传递base*,而virtual将完成它的任务。我们不能强制线程运行任何特定的实现(&class1::&class2::),因为.get()调用可能会返回一个指向与先前指定类型不匹配的类型的基指针。此信息仅在运行时可用

发表评论