2

CMOS カメラから画像を取得するライブラリの使用に小さな問題があります。ライブラリではストリーム機能の使用が許可されており、画像を取得するとき、画像がドロップされたとき、およびエラーが発生したときに設定する 3 つのアクセス ポイント (3 つのデリゲート) があります。

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++ で自分のデリゲートをプラグインするにはどうすればよいですか? クラス内でこのストリーム機能を使用するとします。少なくとも 2 つのオプションがあることがわかっています。ラッパー、およびグローバル変数。以外のものを渡すことができないため、最初のものは危険にさらされているようであり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 に答える