c ++指向函数的指针作为参数

时间:2014-06-06 11:39:16

标签: c++ member-function-pointers

我有一个带有cThread类的C ++ API,以及这个创建线程的方法:

void cThread::start(void(*a_function)(void), CThreadPriority a_level);

我已经完成了一个类和一个init()方法来启动一个线程和一个由线程执行的updateHaptics()方法:

void EntryClass::init()
{
typedef void (EntryClass::*method)();
method p;
p = &EntryClass::updateHaptics;

// create a thread which starts the main haptics rendering loop
cThread* hapticsThread = new cThread();
hapticsThread->start(p, CTHREAD_PRIORITY_HAPTICS);
}

void EntryClass::updateHaptics(void)
{
    // ...  
}

我的问题是将updateHaptics()方法作为参数传递给cThread :: start()方法。

我有这个错误:

1>EntryClass.cpp(55): error C2664: 'void chai3d::cThread::start(void (__cdecl *)(void *),const chai3d::CThreadPriority,void *)' : impossible de convertir l'argument 1 de 'method' en 'void (__cdecl *)(void)'

REM:我在Windows 8 / Visual Studio

2 个答案:

答案 0 :(得分:0)

据我所知,我们只能使用静态函数作为线程proc。是的,我们也可以传递类静态函数。

答案 1 :(得分:0)

您指定的签名

void(*a_function)(void)

用于函数,不用于类方法。静态方法也可以使用

请注意与您使用的typedef的区别:

void (EntryClass::*method)();

定义可以是:

class EntryClass {
public:

  void init();

  static void updateHaptics(); // <--- NOTE the static
};

和您的实施

void EntryClass::init()
{
typedef void (*method)(); // <---- NOTE THIS CHANGE
method p;
p = &EntryClass::updateHaptics;

// create a thread which starts the main haptics rendering loop
cThread* hapticsThread = new cThread();
hapticsThread->start(p, CTHREAD_PRIORITY_HAPTICS);
}

void EntryClass::updateHaptics(void)
{
    // ...  
}