2017-04-09 71 views
0

这个问题类似:Start thread with member function这一个:std::thread calling method of class与派生类的成员函数启动线程

不过,我有以下几点:

#include <thread> 
#include <iostream> 
class myAbstractClass { 
public: 
    virtual void myFunction() = 0;//abstract class 
} 

class myFirstClass : public myAbstractClass { 
public: 
    void myFunction() { std::cout << "First class here";} 
} 

class mySecondClass : public myAbstractClass { 
public: 
    void myFunction() { std::cout << "Second class here";} 
} 

然后,我要叫myFunction()从一个不同的地方新线程,但以下不编译(我想不出其他任何东西尝试):

public void callMemberFunctionInThread(myAbstractClass& myInstance) { 
    std::thread myThread (&myAbstractClass::myFunction, myInstance); 
    //supposed to call myInstance.myFunction() on myThread 
} 
+1

“不编译”不是很具体。你收到什么错误信息? –

+0

Intellisense不抱怨,编译开始,然后它给'C2259'myAbstractClass':不能实例化位于C:\ Program Files文件(x86)\ Microsoft Visual Studio \ 2017 \ Community \ VC中的文件'tuple'中的抽象类\ Tools \ MSVC \ 14.10.25017 \ include'(line 199) – ProgrammingMachine5000

+1

'std :: ref(myInstance)'? – peppe

回答

1

通过std::ref(myInstance)。请注意0​​构造函数将传递给它的参数的副本(请参阅here),并且不能复制myAbstractClass

(然后,所有的这仍会因为std::thread功能在的std::invoke,其解开由std::ref获得的std::reference_wrapper并调用成员函数指针到它的术语描述工作。参见here)。