2013-07-28 32 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类方法相比,它的优点是它不需要在头文件中公开,所以它在某种意义上更私有。

相关问题