Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过子成员函数创建线程_C++_C++11_Stdthread_Stdbind - Fatal编程技术网

C++ 如何通过子成员函数创建线程

C++ 如何通过子成员函数创建线程,c++,c++11,stdthread,stdbind,C++,C++11,Stdthread,Stdbind,我有一个IBase类和一个Child类。我需要在不同的子类中调用不同的proc函数。我不确定下面哪种形式是正确的,也许XD也是 表1:确切地说,我不希望我的IBase具有任何非虚拟功能 表2:有一个奇怪的表达&IBase::proc可能会引起一些误解 class-IBase { 公众: 虚拟void proc()=0; 自动创建绑定() { 返回bind(&IBase::proc,this); } }; 班级儿童:公共IBase { 公众: void proc()重写 { 我会用表3:-):

我有一个
IBase
类和一个
Child
类。我需要在不同的子类中调用不同的
proc
函数。我不确定下面哪种形式是正确的,也许XD也是

  • 表1:确切地说,我不希望我的
    IBase
    具有任何非虚拟功能
  • 表2:有一个奇怪的表达
    &IBase::proc
    可能会引起一些误解
class-IBase
{
公众:
虚拟void proc()=0;
自动创建绑定()
{
返回bind(&IBase::proc,this);
}
};
班级儿童:公共IBase
{
公众:
void proc()重写
{
我会用表3:-):

使用
IBase
中的
start
作为:

thread* start()
{
    thread* t = new thread(createBind());

    return t;
}

在我看来,这将隐藏实现的更多细节,并为调用者提供他期望的API(启动线程)。

最惯用和健壮的方法可能是这样的

std::thread t([=]{pointer->proc();});

没有绑定,没有无关的helper成员函数,没有多余提到类名的奇怪语法。

(这是我处理的代码特有的,不是一般规则)通常说来,“iPart”接口只包含虚拟/纯虚拟函数的声明,比如('virtualFunc')。然后从接口类派生类,如DeriveClass1和DeriveClass2,它们有自己的“virtualFunc”实现。现在,有一个基类指针指向其中一个派生类对象,并使用该指针调用函数。因此,在运行时根据obj的类型调用相应的派生类函数诸如此类。你到底为什么要在堆上分配
std::thread
?那么谁来释放thread对象呢?我个人认为这可能会使问题变得更复杂。我没有关注这方面(因为这不是问题的一部分)-你的线程什么时候会被破坏?可以使用auto_ptr或unique_ptr或其他实例管理结构修复我的取消分配问题。
thread* start()
{
    thread* t = new thread(createBind());

    return t;
}
std::thread t([=]{pointer->proc();});