1

オーディオ用の SDL と SDL_Mixer を使用して C++ アプリケーションを作成しようとしており、このチュートリアルに従おうとしています。ただし、SDL_Mixer の Mix_HookMusicFinished() を使用しても機能せず、次のエラーが発生します: タイプ 'void (CApp::)()' の引数が 'void (*)()' と一致しません

このエラーについて調べたところ、問題は cleanMusic が CApp のメンバー関数であることのようです。ただし、この問題に似た問題のほとんどは pthread_create() に集中しているため、問題の解決方法はわかりません。私の cleanMusic() 関数は、CApp のプライベート変数である music_ にアクセスできる必要があります。エラーを解決するにはどうすればよいですか?

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