You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:24:02