Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C委托给C++;_C++_Delegates - Fatal编程技术网

C++ C委托给C++;

C++ C委托给C++;,c++,delegates,C++,Delegates,我在使用从CMOS相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,我有三个访问点(三个代理)用于设置何时获取图像、何时删除图像以及何时出现错误 typedef void(* StreamCallbackPtr)( IMAGE *image ); typedef void(* StreamErrorCallbackPtr)(); typedef void(* StreamFrameDroppedCallbackPtr)(); int Stream_Start( DEVICE devic

我在使用从CMOS相机获取图像的库时遇到了一个小问题。 该库允许使用流功能,我有三个访问点(三个代理)用于设置何时获取图像、何时删除图像以及何时出现错误

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
中引用。