我在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 ++,而且我对回调,类型和范围的了解并不深。你能帮助我找到一个没有公共方法的工作解决方案吗?
提前致谢!
致命
答案 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
因此,要么在所列答案的帮助下使用成员函数,请使用静态成员函数,或者只使用不属于某个类的普通旧函数。