簡體   English   中英

指向函數的C ++指針作為參數

[英]c++ pointer to a function as argument

我有一個帶有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下

據我所知,我們只能將靜態函數用作線程proc。 是的,我們也可以通過類靜態函數。

您指示的簽名

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)
{
    // ...  
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM