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 或 boost/function(如果没有),我建议您使用 std::function,它为您提供了更多的表示能力并且不易出错。

一般来说,如果没有令人信服的理由,不建议使用这种类似 c 的技术。

于 2013-07-26T09:58:50.990 回答
0

您需要做的不仅仅是一个简单的更改来“修复”这个问题。

问题在于Image(例如DrawOriginalSize)的成员函数与常规函数不同 - 它们有一个this隐含的附加参数,因此您不会“看到”该参数。这意味着常规函数指针,例如img.ipp.draw不能是成员函数。

有几个解决方案。如果你做draw一个std::functionin IMAGEPROCESSINGPARAMETER,它会立即工作。

或者,您需要将函数设为Image静态 - 如果它们仍然需要成为成员函数(也就是说,它们正在使用一些成员变量),您将需要创建一个静态包装函数 - 然后包装函数需要一个额外的参数,这是指向对象的指针,然后将其制成this指针。

于 2013-07-26T10:22:36.973 回答