0

最近、コールバック関数について知り、アプリに実装したいと考えています。ここに私がこれまでに得たものがあります。

// In my image.h

typedef void (__stdcall *DrawingMethod)(IplImage*, HDC, RECT*);

typedef struct _IMAGEPROCESSINGPARAMETER {
    ...
    DrawingMethod draw;
}
IMAGEPROCESSINGPARAMETER,*PIMAGEPROCESSINGPARAMETER,*LPIMAGEPROCESSINGPARAMETER;

class Image {
    public:
        void DrawOriginalSize(IplImage*, HDC, RECT*);
        void DrawToRect(IplImage*, HDC, RECT*);
        void DrawIsotropic(IplImage*, HDC, RECT*);
        int Show();
        IMAGEPROCESSINGPARAMETER ipp;
    ...
};

// In my image.cpp

int Image::Show()
{
    // Get IplImage, HDC, and RECT and finally call the function
    ...
    DrawingMethod d = ipp.draw;
    d(img, dc, &rc);
    return 0;
}

// In main.cpp

#include "image.h"
static Image img;
...
case IDC_FILE_OPEN: {
    img.ipp.draw = img.DrawOriginalSize; // This is ERROR
    img.Show();
    break;
}

このコードを機能させるにはどうすればよいですか、またはこのようなコードを書くのは間違っていますか?

少し早いですがお礼を

4

2 に答える 2

1

C++11 を使用している場合は std::function を使用することをお勧めします。そうでない場合は boost/function を使用することをお勧めします。これにより、表現力が大幅に向上し、エラーが発生しにくくなります。

一般に、やむを得ない理由がない限り、このような C ライクな手法を使用することはお勧めできません。

于 2013-07-26T09:58:50.990 に答える
0

これを「修正」するには、複数の単純な変更を行う必要があります。

Image問題は、 ( などの)のメンバー関数がDrawOriginalSize通常の関数と同じではないthisことです。それらには暗黙的な追加のパラメーターがあるため、そのパラメーターは「表示」されません。img.ipp.drawこれは、メンバー関数になれないなどの通常の関数ポインターを意味します。

いくつかの解決策があります。を作成drawするstd::functionIMAGEPROCESSINGPARAMETER、すぐに機能します。

または、関数をImage静的にする必要があります - それでもメンバー関数である必要がある場合 (つまり、いくつかのメンバー変数を使用している場合)、静的ラッパー関数を作成する必要があります - ラッパー関数は 1 つの追加パラメーターを取ります。これは、オブジェクトへのポインターであり、ポインターになりthisます。

于 2013-07-26T10:22:36.973 に答える