我正在考虑使用工厂模式并在实例上生成线程。
下面是我的代码,我得到以下错误:
error: invalid use of non-static member function ‘virtual void base::threadFunction()’
75 | thread t1(myClass1->threadFunction);
#include <memory>
#include <iostream>
#include <thread>
using namespace std;
enum classEnum
{
class1Enum,
class2Enum
};
class base
{
public:
base(classEnum classType)
{
this->classType = classType;
}
classEnum getClassEnum() { return classType; }
virtual void threadFunction() = 0;
private:
classEnum classType;
};
class class1: public base
{
public:
class1() :
base(class1Enum)
{
}
void threadFunction()
{
cout << "Hello from class1n";
//call uniqueFunction using unique variables
}
private:
//unique variable types and functions
};
class class2: public base
{
public:
class2() :
base(class2Enum)
{
}
void threadFunction()
{
cout << "Hello from class2n";
//call uniqueFunction using unique variables
}
private:
//unique variable types and functions
};
class factory
{
public:
static std::shared_ptr<base> create(classEnum classType)
{
switch(classType)
{
case class1Enum:
return make_shared<class1>();
case class2Enum:
return make_shared<class2>();
default:
return NULL;
}
}
};
int main()
{
shared_ptr<base> myClass1 = factory::create(class1Enum);
shared_ptr<base> myClass2 = factory::create(class2Enum);
thread t1(myClass1->threadFunction);
thread t2(myClass2->threadFunction);
t1.join();
t2.join();
return 0;
}
现在,我看到错误表明我使用的是非静态方法,但将基更改为静态意味着我不能再访问成员变量,派生函数也不会被调用(这是有道理的(。
那么我应该如何生成这些线程呢?
由于这些函数是非静态的(即,它们是在对象上调用的(,因此线程需要对象来进行调用。更改此项:
thread t1(myClass1->threadFunction);
thread t2(myClass2->threadFunction);
到此:
thread t1(&base::threadFunction, myClass1.get());
thread t2(&base::threadFunction, myClass2.get());
这告诉线程调用传递对象上的threadFunction
。
注意语法(&
和::
(的变化,我们正在调用base
版本——这是因为我们正在传递base*
,而virtual
将完成它的任务。我们不能强制线程运行任何特定的实现(&class1::
或&class2::
(,因为.get()
调用可能会返回一个指向与之前指定的类型不匹配的类型的基指针。此信息仅在运行时可用。