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 (*)()"

4

2 回答 2

1

您可以移动musicFinished到您的CMusic类并将其声明为static类方法。 static不在对象上调用类方法;因此,它们没有隐式参数来指定this指针的值,因此它们可以具有与独立函数相同的签名。您还可以使用它private来防止任何事情CMusic

但是,由于您的musicFinished方法当前作为独立函数工作,因此可能不需要访问CMusic'sprotectedprivate成员,并且由于您限制其范围的努力可能意味着您不希望其他东西调用它,我个人会将您的函数保留为独立的,但在源(或)文件中将其musicFinished声明为static(或将其移动到匿名命名空间,如果您愿意) 。这样做会将其范围限制为源文件(“编译单元”)。与,类方法相比的一个优点是它根本不需要在头文件中公开,因此在某种意义上它更私有。CMusic.cpp.ccprivatestatic

于 2013-07-28T20:37:19.710 回答
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我的小函数中的值。

于 2013-07-28T19:45:45.707 回答