我在使用从 CMOS 相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,并且我可以在获取图像、删除图像以及出现错误时设置三个访问点(三个委托(delegate))。
typedef void(* StreamCallbackPtr)( IMAGE *image );
typedef void(* StreamErrorCallbackPtr)();
typedef void(* StreamFrameDroppedCallbackPtr)();
int Stream_Start( DEVICE device, IMAGEFORMAT format, StreamCallbackPtr stream_callback, StreamFrameDroppedCallbackPtr f_dropped_callback, StreamErrorCallbackPtr error_callback );
一旦相机上的图像准备就绪,我就会输入 StreamCallbackPtr,但请记住,我没有任何方法来更改库代码。
问题是:如何在 C++ 中插入我自己的委托(delegate)?
假设我在类中使用此流功能,我知道我至少有两个选择;包装器和全局变量。第一个似乎受到了损害,因为除了 IMAGE
之外我无法传递任何其他内容,并且我想避免使用全局变量(在本例中它将是静态成员)。
有什么想法吗?
最佳答案
您可以使用静态成员函数作为StreamCallbackPtr
,然后它可以访问希望接收消息的 C++ 委托(delegate)的私有(private)静态引用或引用列表。
这样你就隐藏了大部分细节,作为类的私有(private)信息。
下面的代码是伪 C++(我没有正确检查过),但它应该能让您了解我的建议。
class Delegate
{
protected:
void Callback( IMAGE *image ) = 0;
void Error() = 0;
void FrameDropped() = 0;
public:
static void SetDelegate(Delegate* d) { delegateInstance = d; }
static void StaticCallback( IMAGE *image)
{
// Invoke the delegate instance
if (delegateInstance != nullptr) delegateInstance->Callback();
}
// Same for the others...
private:
static Delegate* delegateInstance = nullptr;
};
class MyClass : public Delegate
{
protected:
void Callback( IMAGE *image )
{
// Now the callback is in a delegate instance
}
};
int main(void)
{
MyClass mc;
Delegate::SetDelegate(&mc);
StreamCallbackPtr scp = &Delegate::StaticCallback;
// Register the other static callbacks...
return 0;
}
关于c++ - C 委托(delegate)给 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18130905/