C++ C委托给C++;
我在使用从CMOS相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,我有三个访问点(三个代理)用于设置何时获取图像、何时删除图像以及何时出现错误C++ C委托给C++;,c++,delegates,C++,Delegates,我在使用从CMOS相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,我有三个访问点(三个代理)用于设置何时获取图像、何时删除图像以及何时出现错误 typedef void(* StreamCallbackPtr)( IMAGE *image ); typedef void(* StreamErrorCallbackPtr)(); typedef void(* StreamFrameDroppedCallbackPtr)(); int Stream_Start( DEVICE devic
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++中插入自己的委托? 假设我在一个类中使用这个流功能,我知道我至少有两个选择;包装器和全局变量。第一个似乎是折衷的,因为我只能传递
图像
,并且我希望避免使用全局变量(在这种情况下是静态成员)
任何想法?
< P>可以使用static成员函数作为<代码> StreamCallbackPtr <代码>,然后它可以访问一个私有静态引用或引用的列表,这些引用是希望接收消息的C++代表。 这样,您就可以将大部分细节隐藏为类的私有信息 下面的代码是pseudo-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++代表必须是静态的…谢谢代码,我已经尝试过了,但是再次感谢。但是有没有办法不使用静态委托呢?您只是不将调用转发给实例。我又读了你的帖子,我的例子是包装纸吗?如果是这样的话,为什么会妥协?谢谢你的帮助,这可能是最好的解决办法。。。但是仍然缺少一些东西:如何在
MyClass
中最好地隐藏类委托?我是否创建了一个嵌套类(在MyClass
内部)Delegate
和另一个嵌套类DelegateHelper
(从Delegate
继承)来保存委托方法并从MyClass
本身调用该方法?如果您想隐藏它那么多,我只需要使用静态方法,它们调用的委托方法和静态实例直接在MyClass
中引用。