我正在尝试使用SDL和SDL_Mixer创建一个用于音频的C ++应用程序,并且我正在尝试关注this教程。但是,使用SDL_Mixer的Mix_HookMusicFinished()不起作用,给出错误:类型'void(CApp ::)()'的参数与'void(*)()'不匹配
我研究过这个错误,似乎问题是cleanMusic是CApp的成员函数。但是,我不知道如何解决这个问题,因为大多数问题都与pthread_create()相关。我的cleanMusic()函数需要能够访问music_,它是CApp的私有变量。我该如何解决错误?
以下是CApp.h,CApp :: handleKeyEvents()和CApp :: cleanMusic()的代码。如果您需要查看其他内容,请告诉我。
CApp.h
#ifndef CAPP_H
#define CAPP_H
#include <SDL.h>
#include <SDL_mixer.h>
#include <gl\gl.h>
#include <gl\glu.h>
class CApp {
private:
bool isRunning_;
private:
void cleanMusic();
private:
SDL_Surface *surfDisplay_;
Mix_Music *music_;
bool isRotating_;
GLfloat rQuad_;
public:
CApp();
int run();
public:
bool initialize();
void handleEvents(SDL_Event *event);
void loopData();
void render();
void clean();
public:
void handleKeyEvents(SDL_KeyboardEvent *key);
};
#endif // CAPP_H
CAPP :: handleKeyEvents()
#include "CApp.h"
void CApp::handleKeyEvents(SDL_KeyboardEvent *key) {
switch(key->keysym.sym) {
case SDLK_m:
if (key->state == SDL_PRESSED) {
if(music_ == NULL) {
music_ = Mix_LoadMUS("resources\\audio\\boop.wav");
Mix_PlayMusic(music_, 0);
Mix_HookMusicFinished(cleanMusic);
isRotating_ = true;
} else {
Mix_HaltMusic();
cleanMusic();
isRotating_ = false;
}
}
break;
default:
break;
}
}
CAPP :: cleanMusic()
#include "CApp.h"
void CApp::cleanMusic() {
Mix_FreeMusic(music_);
music_ = NULL;
}
答案 0 :(得分:1)
两个变化。 cleanMusic
需要static
。
static void cleanMusic();
其次,你注册了钩子:
Mix_HookMusicFinished(&CApp::cleanMusic);
由于您的方法现在为static
,因此music_
也必须为static
。
static Mix_Music *music_;
这意味着在CApp的所有实例化之间只共享一个此变量的实例。由于我没有看到你的所有代码,我不知道这是否是一个问题。
答案 1 :(得分:0)
void cleanMusic();
是所谓的成员函数。成员函数与普通函数非常不同。编译器抱怨的原因是因为Mix_HookMusicFinished
需要类型为void (*)()
的普通函数指针,但是您尝试传递类型为void (CApp::*)()
的成员函数指针。这些类型不兼容。
最简单的解决方案是让cleanMusic
成为正常函数,Mix_Music *music;
成为全局函数:
Mix_Music *music;
void cleanMusic() {
Mix_FreeMusic(music);
music = NULL;
}
另一种方法是让他们成为static
成员:
static void cleanMusic();
static Mix_Music *music_;