2

我在使用从 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++ 中?假设我在一个类中使用这个流功能,我知道我至少有两个选择;包装器和全局变量。第一个似乎受到影响,因为我不能传递除 之外的任何东西IMAGE,并且我想避免使用全局变量(在这种情况下它将是静态成员)。

有任何想法吗 ?

4

1 回答 1

3

您可以使用静态成员函数StreamCallbackPtr,然后可以访问私有静态引用或对希望接收消息的 C++ 委托的引用列表。

这样,您就将大部分细节隐藏为课程的私有内容。

下面的代码是伪 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;
}
于 2013-08-08T16:50:22.520 回答