我正在尝试使用SDL和SDL_Mixer创建音频的C++应用程序,并试图遵循this教程。但是,使用SDL_Mixer的Mix_HookMusicFinished()不起作用,出现错误:类型为'void(CApp::)()'的参数与'void(*)()'不匹配

我研究了此错误,似乎问题在于cleanMusic是CApp的成员函数。但是,由于大多数与此类似的问题都围绕着pthread_create(),因此我无法告诉您如何解决该问题。我的cleanMusic()函数需要能够访问music_,这是CApp的私有(private)变量。我该如何解决错误?

这是CApp.h,CApp::handleKeyEvents()和CApp::cleanMusic()的代码。让我知道您是否需要查看其他内容。

应用程序

#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;
}

最佳答案

两个变化。 cleanMusic必须是static

static void cleanMusic();

其次,使用以下方法注册钩子(Hook):
Mix_HookMusicFinished(&CApp::cleanMusic);

由于您的方法现在是static,因此music_也必须也是static
static Mix_Music *music_;

这意味着在CApp的所有实例之间将仅共享此变量的一个实例。由于我没有看到您的所有代码,因此无法确定这是否是一个问题。

09-27 13:04