我正在使用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 (*)()"
答案 0 :(得分: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 :(得分:1)
您可以将musicFinished
移至CMusic
类,并将其声明为static
类方法。不在对象上调用static
类方法;因此,它们没有隐式参数来指定this
指针的值,因此它们可以具有与独立函数相同的签名。除此之外,您还可以private
阻止CMusic
以外的任何内容使用它。
但是,由于您的musicFinished
方法目前可用作独立功能,因此可能不需要访问CMusic
的{{1}}或protected
成员,你努力限制其范围可能意味着你不希望其他东西称之为它,我个人会将你的private
函数保留为独立但将其声明为musicFinished
(或将其移动到匿名命名空间) ,如果您愿意,可以在static
来源(CMusic
或.cpp
)文件中。这样做会将其范围限制为源文件(“编译单元”)。优于.cc
,private
类方法的一个优点是它不需要在头文件中公开,因此它在某种意义上更加私密。