将类回调函数分配给结构

Assign class callback function to struct?

本文关键字:结构 分配 函数 回调      更新时间:2023-10-16

最近我了解了回调函数,我想在我的应用程序中实现它。到目前为止我得到了什么。

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

我怎样才能使这个代码工作,或者这样写代码是错误的吗?

提前感谢

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

一般来说,如果没有令人信服的理由,那么使用这种类似c的技术是不可取的。

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

问题是Image的成员函数(如DrawOriginalSize)与正则函数不同——它们有一个隐含的this参数,所以你看不到这个参数。这意味着正则函数指针(如img.ipp.draw)不能是成员函数。

有几个解决方案。如果您在IMAGEPROCESSINGPARAMETER中将draw设为std::function,它将立即工作。

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