c++ - 无法访问在标准回调中传递的对象变量

标签 c++ forward-declaration dereference

我有一个回调函数(在我的类之外),我将 BassMusicPlayer 类对象作为参数传递。如果在里面做一个断点,我可以看到'self'中的所有变量和方法。

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

这是我的类文件中的内容:

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 函数

关于c++ - 无法访问在标准回调中传递的对象变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29874711/

相关文章:

c++ - 如何使用 std::mt19937 避免相同的随机结果?

c++ - 从 C++ 中的 void 函数返回

c++ - 仅存在声明时不包含类头

c++ - 为什么可以取消引用 C++ 迭代器,尽管它不是指针?

java - 我是一名初学者编码器,我正在尝试编写井字棋游戏,但出现了我不明白的错误

c++ - 调试代码的运行时间比发布代码长几个数量级

c++ - 元胞自动机不会产生新的细胞

C++:匿名结构的结构前向声明导致 "conflicting declaration"

c++ - 新的不完整类型在包装在模板中时编译

pointers - Swift 使用 UnsafePointer<String> 从 UnsafeMutablePointer<Void> 获取值