2

我在 C++ 中使用 BASS 库时遇到了一点问题。播放效果很好,但我想在播放完当前文件后跳到下一个文件。对于这种需要,BASS 提供了回调,我正在使用它(初始化已经完成)......

富.h:

class Foo
{
    public:
        Foo(void);
        ~Foo(void);
        void endOfFile(void);
    private:
        HSTREAM _streamHandle;
        void playFile(string);
};

Foo.cpp:

void Foo::playFile(string fileName)
{
    _streamHandle = BASS_StreamCreateFile(false, fileName.c_str(), 0, 0, BASS_STREAM_AUTOFREE);
    BASS_ChannelSetSync(_streamHandle, BASS_SYNC_END, 0, endOfFileCallback, this);
    BASS_ChannelPlay(_streamHandle, true);

void Foo::endOfFile()
{
    playFile(getNextFileFromSomewhere()); // obviously this is done different in production code
}

void CALLBACK endOfFileCallback(HSYNC handle, DWORD channel, DWORD data, void* pTarget)
{
    Foo* pFoo = static_cast<Foo*>(pTarget);
    pFoo->endOfFile();
}

所以,这行得通,但感觉很难看,有一个函数而不是一个称为回调的方法,并反对endOfFile作为公共方法。它应该是私人的。所以我尝试使用一个方法作为回调......

酒吧.h:

class Bar
{
    public:
        Bar(void);
        ~Bar(void);
    private:
        HSTREAM _streamHandle;
        void playFile(string);
        void endOfFile(void);
        void CALLBACK endOfFileCallback(HSYNC, DWORD, DWORD, void*); // now declaration in class
};

酒吧.cpp:

void Bar::playFile(string fileName)
{
    _streamHandle = BASS_StreamCreateFile(false, fileName.c_str(), 0, 0, BASS_STREAM_AUTOFREE);
    BASS_ChannelSetSync(_streamHandle, BASS_SYNC_END, 0, endOfFileCallback, 0); // no reference to 'this' needed
    BASS_ChannelPlay(_streamHandle, true);

void Bar::endOfFile()
{
    playFile(getNextFileFromSomewhere()); // obviously this is done different in production code
}

void CALLBACK Bar::endOfFileCallback(HSYNC handle, DWORD channel, DWORD data, void* pTarget)
{
    endOfFile();
}

但这不能编译:-(

error: cannot convert 
    ‘Bar::endOfFileCallback’ 
from type 
    ‘void (Bar::)(HSYNC, DWORD, DWORD, void*) {aka void (**Player**::)(unsigned int, unsigned int, unsigned int, void*)}’ 
to type 
    ‘void (*)(HSYNC, DWORD, DWORD, void*) {aka void (*)(unsigned int, unsigned int, unsigned int, void*)}’

我猜你看到了区别 (Bar::) 而不是 (*)。所以问题很清楚,但遗憾的是我没有足够的技能来解决它​​。我只在私人时间做 c++,我对回调、类型和范围没有那么深入。你们能帮我找到一个没有公共方法的工作解决方案吗?

提前致谢!

致命的

4

1 回答 1

0

我有同样的错误。我也是 C++ 新手。

在 C++ 中,指向函数的指针和指向成员函数的指针之间存在很大差异。这些答案对我帮助很大:

将成员函数作为参数传递给构造函数

C++ 将成员函数作为参数传递

如何将类成员函数作为回调传递

因此,要么在列出的答案的帮助下使用成员函数,要么使用静态成员函数,要么只使用不属于某个类的普通旧函数。

于 2016-04-18T13:52:48.157 回答