2013-07-28 34 views
0

我正在使用SDL2_mixer庫,但我認爲這個問題也應該適用於一般情況。有沒有辦法改變回調的範圍而不改變參數?

目前,我想使用的函數Mix_HookMusicFinished(void (*music_finished)(void))對C樣式函數的全局範圍具有設置的回調。不過,我希望將該回調設置爲我自己的類void CMusic::musicFinished()中的成員函數,而不需要全局範圍內的函數。

有沒有辦法做到這一點?就像Mix_HookMusicFinished(musicFinished)會很好,但直接有一個錯誤argument of type "void (CMusic::*)()" is incompatible with parameter of type "void (*)()"

回答

1

你需要做一個「包裝」功能。然而,這裏的問題是,你還需要能夠找到您要「完成」的CMusic對象 - 這是真的是什麼類型的

爭論的癥結所在......格格不入..

就是這樣。由於沒有辦法將參數傳遞給musicFinished對象,因此您需要一些其他方法來「找到」CMusic對象。

如果我們假設有一個辦法做到這一點,那麼像這樣的工作:

class CMusic 
{ 
    ... 

public: 
    ... 
    static void musicFinishedWrapper(); 
    void musicFinished(); 
    ... 
}; 


void CMusic::musicFinishedWrapper() 
{ 
    CMusic* music = getTheMusicSomehow(); // No idea how you do this - depends on your code. 

    music->musicFinished(); 
} 

你必須有一個CMusic對象是你的musicFinished預期(隱藏)this指針參數的原因 - 這是我的小功能music中的值。

1

您可以將musicFinished移動到您的CMusic類,並將其聲明爲static類方法。在對象上不調用類方法;因此它們沒有隱式參數來指定this指針的值,因此它們可以具有與獨立函數相同的簽名。您還可以使其private防止除CMusic之外的任何內容使用它。

然而,由於你的musicFinished方法目前是一個獨立的功能,因此可能並不需要protectedprivate成員,因爲你的努力,以限制其範圍訪問CMusic的大概意思是,你不希望其他我個人會將musicFinished函數作爲獨立函數使用,但在CMusic源文件(.cpp.cc)文件中聲明爲static(或將其移至匿名命名空間,如果您願意的話)。這樣做會將其範圍限制爲源文件(「編譯單元」)。與private,static類方法相比,它的優點是它不需要在頭文件中公開,所以它在某種意義上更私有。

相關問題