2016-02-02 81 views
0

這個問題介於理論與實踐之間。在C++中分配回調函數

我有一個C文件(姑且稱之爲fileA.c和fileA.h)

fileA.h一個結構的定義是這樣的:

typedef struct 
{ 
    /** Callback function which is called upon an event occurrence */ 
    void (*FileAcb)(MyEvent event, uint8 val); 
} MyStruct; 

在fileB.cpp和fileB.h,我正試圖像這樣給它分配回調函數。

FileB.h

class FileB 
{ 
    public: 
     static void Callback(MyEvent event, uint8 val); 
    protected: 
     /**Protected members */ 
    private: 
     /**Private members */ 
     MyStruct myStruct; 
}; 

FileB.cpp

bool FileB::Start() 
{ 
    myStruct.FileAcb= FileB::Callback; 

    return true; 
} 

void FileB::Callback(MyEvent event, uint8 val) 
{ 
    //do some stuff here. 
} 

而這個工作。不過,我正在尋找一種方式來寫這條線:在某種程度上,讓我FILEB

myStruct.FileAcb= FileB::Callback; 

::回調函數不被靜電。有沒有辦法實現這一點?

+0

「我有一個C文件(我們稱它爲fileA.c和fileA.h)」 - 根據是否將頭文件計爲C文件(在「C語言」的意義上),或者使得兩個C文件或一個不相關。無論如何,那不是C! – Olaf

+0

@Olaf我想在這種情況下,我給了無關的信息。最終,我關心的是FileA.h中的typedef結構。 –

+0

您是否在網上搜索關於您的問題? ^^ https://www.google.de/search?q=cpp+Callback+function+to+NOT+be+static.&ie=utf-8&oe=utf-8&gws_rd=cr&ei=_MiwVtqYF4fcO6f4s8gM –

回答

1

有沒有辦法做到這一點?

不直接。 傳統的C風格的方式做,這是提供一個void*參數,它指向你的對象,和一點點轉發功能:

struct CallbackWithData 
{ 
    void *closure; 
    void (*callback)(void *closure, MyEvent event, uint8 val); 
}; 

void ForwardToFileB(void *closure, MyEvent event, uint8 val) 
{ 
    FileB *target = (FileB *)closure; 
    target->Callback(event, val); 
} 

即使在非面向對象式的C,這是傳統的要提供這樣一種的回調函數的參數,所以他們有一個地方可以保持他們可能需要的任何狀態。

C++類似的方法是使用std::function<void(MyEvent,uint8_t)>而不是原始指針。