用工厂模式在C++中的派生类中生成线程



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

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

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()调用可能会返回一个指向与之前指定的类型不匹配的类型的基指针。此信息仅在运行时可用。

最新更新