我有一个回调函数(代替我的课),我将BassMusicPlayer类对象作为参数传递。如果在其中做一个断点,我可以看到“self”中的所有变量和方法。

如果我尝试读取/打印这些值,它将无法编译,并且会出现错误C2027:使用未定义类型'BassMusicPlayer'。我还按照其他人的建议在类定义中添加了static。我可以将全局变量用作解决方法,但我真的想避免这样做。

这是我的类(class)文件中的内容:

class BassMusicPlayer;
void __stdcall LoopSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user) {
    BassMusicPlayer * self = reinterpret_cast<BassMusicPlayer*>(user);
    //printf("%d\n", self->loop_start);
    //if (!BASS_ChannelSetPosition(channel, self->loop_start, BASS_POS_BYTE))
    if (!BASS_ChannelSetPosition(channel, 0, BASS_POS_BYTE)) // try seeking to loop start
        BASS_ChannelSetPosition(channel, 0, BASS_POS_BYTE); // failed, go to start of file instead
}



class BassMusicPlayer {
private:
    std::string          m_filename;
    int                  m_filetype;
    int                  m_music_handle;
    BassMusicPlayer*     m_music;
    HWND                 m_handle;
    DWORD                m_sample_rate;
    SYNCPROC*            m_callback_proc;

public:
    QWORD loop_start, loop_end;

    // constructor
    BassMusicPlayer(HWND handle, DWORD sample_rate, SYNCPROC* callback_proc) {
        m_handle = handle;
        m_sample_rate = sample_rate;
        m_callback_proc = LoopSyncProc;
    }

    bool OpenMusicFile(std::string filename, QWORD seek_start, QWORD file_length, bool start_playing, bool loop, QWORD loopstart, QWORD loopend) {
        loop_start = loopstart;
        loop_end = loopend;
        m_music_handle = BASS_MusicLoad(false, filename.c_str(), 0, 0, BASS_MUSIC_POSRESET, m_sample_rate);
        BASS_ChannelSetSync(m_music_handle, BASS_SYNC_END | BASS_SYNC_MIXTIME, 0, m_callback_proc, this);
    }
};

为什么仅当我要访问其BassMusicPlayer类的变量时才能识别该类?

最佳答案

您的BassMusicPlayer无法识别,因为您有以下情况:

class BassMusicPlayer;

这称为前向声明。它告诉编译器类BassMusicPlayer存在,但没有告诉它该类是什么,其对象需要多少空间或它具有哪些成员。由于指针只是整数,在您尝试对其进行处理之前,它们指向的对象都没有关系,因此编译器可以很好地使用指针,但是在您尝试取消引用其中一个指针的时候(例如,通过访问其函数或变量和->运算符),则编译器将失败,因为它不知道如何执行此操作。直到在回调之后稍后才实际声明该类时,它才发现。

要解决此问题,请将您的回调移动到类的声明之后。因为您必须了解类中的函数,所以应改为声明该函数,如下所示:
void __stdcall LoopSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user);

您的代码的整体顺序应为:
  • 向前声明LoopSyncProc函数
  • 声明类
  • 定义LoopSyncProc函数
  • 10-06 06:38