2016-03-23 17 views
1

我已經創建了簡單的C++包裝類,但我目前的問題有點令人困惑。我有一個可以連接到USB端口的自定義硬件,根據執行不同事件處理程序的硬件配置,它提供了某些信息。它使用Ethernet-over-USB協議。在PC端的C代碼如下所示:如何爲以下類型的C程序創建C++包裝類?

// Relevant headers 

int Event1handler(){ 
    // Code to process event 1 
} 

void Event2handler(){ 
    // Code to process event 2 
} 

int main(void){ 
    // Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods 
} 

現在我很困惑如何環繞上面的代碼C++類。在C程序中,事件處理程序根據來自USB的信息自動調用。我如何將事件處理程序實現爲根據硬件發送的信息自動調用的類的方法?我可以把main()函數的內容放入類的構造函數中嗎?

編輯:我不需要單獨的類的方法。我只需要將C程序包裝到一個類中。把所有的事件處理程序放到一個單獨的方法中也是可以的(如果可能的話)。我只需要每個事件處理程序收到的數據。

EDIT2:下面是實際的事件處理程序,並調用看起來就像使用OpenSoundControl:

// Relevant headers 

int Event1handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){ 
    // Code to process event 1 
} 

void Event2handler(const char *path, const char *types, lo_arg **argv, int argc, void *data, void user_data){ 
    // Code to process event 2 
} 

int main(void){ 
    // Code to setup calls to Event1handler() and Event2handler() using Open Sound Control methods 
    lo_server_thread st; 
    // "if" means one integer and one float 
    lo_server_thread_add_method(st, "/folder/data1", "if", Event1handler, NULL); 
    lo_server_thread_add_method(st, "/folder/data2", "if", Event2handler, NULL); 
} 
+0

我根本不知道開放聲音控制,但許多基於C語言的回調系統(尤其是GUI)可以包裝在一個類中。回調函數是靜態成員函數。這些回調通常接受一個指向用戶定義數據的指針。當您在對象的構造函數中設置回調函數時,您會將'this'作爲該數據傳遞。回調會將指針轉換回類類型,然後調用成員函數來完成實際工作,並傳遞給回調的任何額外數據。希望有所幫助。 –

+0

感謝您的提示。我覺得它非常相關。我只是將更多的代碼添加到我的文章中,以便您可以看到OpenSoundControl是如何工作的,如果您認爲您的想法適用,請發佈一些示例代碼。 – user1420

回答

1

只需創建一個類,並把裏面的代碼,例如在.h文件:

class EventWrapper 
{ 
public: 
    EventWrapper(); 
    static int Event1Handler(); 
    static void Event2Handler(); 
} 

然後在您的.cpp文件中:

#include "EventWrapper.h" 
// Include relevant headers for your USB device 

EventWrapper::EventWrapper() 
{ 
    // Code to setup calls to Event1handler() and Event2handler() 
    // using Open Sound Control methods. 
} 

int EventWrapper::Event1Handler() 
{ 
    // Code to process event 1 
} 

void EventWrapper::Event2Handler() 
{ 
    // Code to process event 2 
} 

在不知道程序的所有細節的情況下,您可能需要弄清楚什麼是靜態的以及如何處理它。

+0

謝謝。我想像它會像你發佈的內容,但你可以看看我的第二次編輯看到打開聲音控制相關的線?如果硬件正在發送Event1的數據,EventWrapper :: Event1Handler()會自動調用嗎?這就是讓我困惑的原因。另請參閱我發佈的一些附加代碼。 – user1420

+0

另一個問題與我的第一個問題有關。這可能是非常微不足道的,但是..如何在不知道通過USB發送什麼數據的情況下如何調用靜態成員函數? – user1420

+0

這兩個靜態成員函數應自動從USB驅動程序代碼中調用。您需要在USB驅動程序代碼中調用這些代碼,以便將這些處理代碼放在這兩個函數中。 – user2205930