C++工厂模式下派生类实例创建线程调用非静态成员函数报错如何解决
问题原因
error: invalid use of non-static member function ‘virtual void base::threadFunction()’
这个报错的核心是:C++非静态成员函数调用时需要隐含的this指针作为入参,直接将成员函数名传递给std::thread构造函数时,没有提供对应的实例对象,无法完成调用。将函数改为静态会破坏多态特性、也无法访问实例成员变量,完全不需要这么做。
正确解决方案
std::thread的构造函数原生支持传递非静态成员函数+对应实例对象,你只需要修改创建线程的代码即可,所有方案都可以保留虚函数多态特性、正常访问实例成员:
- 写法1:直接传成员函数指针+实例(最简洁)
第一个参数取成员函数的地址,第二个参数传入要调用的实例智能指针即可,内部会自动完成虚函数分发:thread t1(&base::threadFunction, myClass1); thread t2(&base::threadFunction, myClass2); - 写法2:用lambda表达式封装(扩展性最强,要加额外逻辑时最方便)
值捕获智能指针可以自动延长实例生命周期,避免实例提前释放导致野指针:thread t1([myClass1]() { myClass1->threadFunction(); }); thread t2([myClass2]() { myClass2->threadFunction(); }); - 写法3:用
std::bind绑定实例thread t1(std::bind(&base::threadFunction, myClass1)); thread t2(std::bind(&base::threadFunction, myClass2));
额外优化建议
你代码中factory::create的默认分支返回NULL,C++11及以上标准推荐改用nullptr,避免类型隐式转换问题。
修改后可正常运行的完整main函数代码
int main() { shared_ptr<base> myClass1 = factory::create(class1Enum); shared_ptr<base> myClass2 = factory::create(class2Enum); // 任选上面三种写法之一即可,这里用最简洁的写法1 thread t1(&base::threadFunction, myClass1); thread t2(&base::threadFunction, myClass2); t1.join(); t2.join(); return 0; }
内容的提问来源于stack exchange,提问作者SailorCire
相关产品推荐
相关产品推荐

