2016-03-03 59 views
0

我試圖在使用rti connext作爲通信服務的涼亭中設置一個模擬,以將一些參數傳輸到外部軟件。在編譯時不知道父類的情況下傳遞一個加括號的函數指針

爲此,我需要在新數據實例到達時,通過傳遞函數指針傳遞給subscriber_init來初始化通信。

subscriber.h

void (*callback)(int i); 
int subscriber_init(int domainId, char* topicName, callback cbPointer); 

通過任何C文件,其中包含的subcriber.h調用此沒有問題。但是,如果我嘗試在課堂上設置我的溝通,問題就會開始擡頭。

Plugin.cxx

#include subscriber.h 
class Plugin{ 
    void load(){ 
    callback cbPointer = &Plugin::handler; 
    subscriber_init(0,"Topic",cbPointer); 
    } 
    void handler(int i){ 
    //do someting 
    } 
} 

這給了我在

error: cannot convert ‘void (Plugin::*)(int)’ to ‘callback {aka void (*)(int)}’ in initialization callback cpPointer = &Plugin::handler 

形式的錯誤我怎樣才能使一個typedef不知道在優勢傳遞函數指針的父類?

免責聲明:未編制的例子,只是爲了清楚什麼,我試圖做

+0

由於錯誤提示,方法指針與函數指針不兼容。 – jxh

+0

你能澄清你的要求嗎?你能改變'subscriber_init'的定義方式嗎? int i'參數的目的是什麼? 「i」參數代表什麼? – jxh

回答

0

handler()是一個類的方法。這不是一個功能。

要麼改變handler()靜態類功能:

static void handler(int i); 

或者使用一些其他的功能。但是,如果你的目的是要調用一個類的方法,那麼你的subscriber_init()既需要一個方法指針,一個類的實例指針:

int subscriber_init(int domainId, char* topicName, 
    void (*Plugin::*callback)(), Plugin *ptr); 

然後你subscriber_init()可以調用實例化類的方法:

ptr->*callback(); 

然後你load()可以傳遞所需的參數:

void load(){ 
    subscriber_init(0,"Topic",&Plugin::handler, this); 
} 
+0

因爲我對cpp非常陌生,所以我不得不問:靜態類函數是在類之外定義的,對吧? 因爲這是我現在正在嘗試,但它給了我一個「變量或字段」處理程序「宣佈無效」的錯誤,我真的不明白 另一方面在subscriber.h中使用類實例指針需要一個包括Plugin.h,對吧? 由於涼亭的結構,這是不是很容易做到這一點:( 我的目標是類方法指針,不知道類的優點... – sagre

+0

靜態類函數是一個函數聲明與靜態關鍵字,在類裏面,你不能有一個類方法指針,「不知道類的類型」,C++不能這樣工作,至少聲明這個類,如果沒有完全定義的話, –

+0

謝謝你的回答。是不幸的,並提出了很多工作;(無論如何,感謝您的耐心 – sagre

0

只是傳遞指針,反對你回調功能或使用void*這樣的:

typedef void (*callback)(int i, void* pParam); 
int subscriber_init(int domainId, char* topicName, callback cbPointer, void* pParam) 
{ 
    //... 
    cbPointer(someInt, pParam); 
    //... 
} 

並更新對應靜態Handler()功能插件類。

class Plugin{ 
    void load(){ 
    callback cbPointer = &Plugin::handler; 
    subscriber_init(0,"Topic", cbPointer, this); 
    } 

    void handler(int i){ 
    //do someting 
    } 

    static void handler(int i, void *pParam){ 
    Plugin *plg = static_cast<Plugin*>(pParam); 
    plg->handler(i); 
    } 
}; 
相關問題