完成内部类

时间:2016-01-09 21:12:56

标签: c++ scope callback bass

我在c ++中使用BASS库时遇到了一些问题。播放工作正常,但我想跳到下一个文件,在播放当前播放结束后。对于这种需要,BASS提供了回调,我正在使用它(init已经完成)......

foo.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 作为公共方法。它应该是私人的。所以我尝试使用一种方法作为回调...

Bar.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
};

Bar.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 ++,而且我对回调,类型和范围的了解并不深。你能帮助我找到一个没有公共方法的工作解决方案吗?

提前致谢!

致命

1 个答案:

答案 0 :(得分:0)

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

在指向函数的指针和指向成员函数的指针之间,C ++有很大的不同。这些答案对我帮助很大:

Passing a member function as an argument to a constructor

C++ passing member function as argument

How can I pass a class member function as a callback

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