1

我正在尝试使用 SDL 和 SDL_Mixer 为音频创建 C++ 应用程序,并尝试遵循教程。但是,使用 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;
}
4

2 回答 2

1

两个变化。cleanMusic需要static

static void cleanMusic();

其次,您使用以下方法注册钩子:

Mix_HookMusicFinished(&CApp::cleanMusic);

由于您的方法是 now static,因此也music_需要static

static Mix_Music *music_;

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

于 2013-05-20T23:15:54.183 回答
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_;
于 2013-05-20T23:14:05.803 回答