ошибка: невозможно преобразовать void (CApp :: *) () в void (*) () для аргумента 1 в void Mix_HookMusicFinished (void (*) ()) ‘

Я пытаюсь создать приложение C ++, используя SDL и SDL_Mixer для аудио, и я пытаюсь следовать этот руководство. Тем не менее, использование Mix_HookMusicFinished () SDL_Mixer’s не работает, выдавая ошибку: аргумент типа ‘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;
}

1

Решение

Два изменения. cleanMusic должно быть static,

static void cleanMusic();

Во-вторых, вы регистрируете крюк с помощью:

Mix_HookMusicFinished(&CApp::cleanMusic);

Так как ваш метод сейчас static, music_ должно быть static также.

static Mix_Music *music_;

Это означает, что будет только один экземпляр этой переменной, совместно используемый всеми экземплярами CApp. Поскольку я не видел весь ваш код, я не могу сказать, является ли это проблемой.

1

Другие решения

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_;
0

По вопросам рекламы [email protected]