Я пытаюсь создайте приложение C++, используя SDL и SDL_Mixer для аудио, и я стараюсь следовать руководству this. Однако использование Mix_HookMusicFinished() SDL_Mixer не работает, давая ошибку: аргумент типа 'void (CApp ::)()' не соответствует 'void (*)()'error: невозможно преобразовать 'void (CApp :: *)()' to 'void (*)()' для аргумента '1' to 'void Mix_HookMusicFinished (void (*)())'
Я исследовал эту ошибку , и, похоже, проблема в том, что cleanMusic является функцией-членом CApp. Однако я не могу сказать, как решить проблему, так как большинство проблем, подобных этому, сосредоточены вокруг pthread_create(). Моя функция cleanMusic() должна иметь доступ к музыке, которая является частной переменной 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;
}
Apis, которые принимают 'void (*)()' callbacks suck. – Yakk