将类回调函数分配给struct?

时间:2013-07-26 09:56:10

标签: c++ class function pointers callback

最近我学习了回调函数,我想在我的应用程序中实现它。这是我到目前为止所得到的。

// 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;
}

如何使这段代码有效或者编写这样的代码是错误的?

提前感谢

2 个答案:

答案 0 :(得分:1)

如果您使用的是C ++ 11或者使用boost / function(如果没有),我建议您使用std :: function,它会为您提供更多的表示能力,并且不容易出错。

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

答案 1 :(得分:0)

您需要做的不仅仅是单一的简单更改,以“修复”此问题。

问题是Image的成员函数(例如DrawOriginalSize)与常规函数不同 - 它们还有一个隐含的this参数,所以你不要“看到”那个参数。这意味着常规函数指针(例如img.ipp.draw)不能是成员函数。

有一些解决方案。如果您在drawstd::function IMAGEPROCESSINGPARAMETER,则可以立即使用。

或者,您需要使Image中的函数为static - 如果它们仍然需要是成员函数(也就是说,它们使用的是某些成员变量),则需要创建一个静态包装函数 - 然后,包装器函数接受一个额外的参数,该参数是指向对象的指针,然后将其作为this指针。