这个问题在这里已经有答案了:
C++11带有类成员函数[duplicate]的多线程
(3个答案)
(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()调用可能会返回一个指向与先前指定类型不匹配的类型的基指针。此信息仅在运行时可用