C++ 将类回调函数分配给struct?
最近我学习了回调函数,我想在我的应用程序中实现它。这是我到目前为止得到的C++ 将类回调函数分配给struct?,c++,class,function,pointers,callback,C++,Class,Function,Pointers,Callback,最近我学习了回调函数,我想在我的应用程序中实现它。这是我到目前为止得到的 // In my image.h typedef void (__stdcall *DrawingMethod)(IplImage*, HDC, RECT*); typedef struct _IMAGEPROCESSINGPARAMETER { ... DrawingMethod draw; } IMAGEPROCESSINGPARAMETER,*PIMAGEPROCESSINGPARAMETER,*
// 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/function(如果不是),我建议您使用std::function,因为它提供了更强大的表示能力,并且更不容易出错
一般来说,如果没有令人信服的理由,不建议使用类似c的技术。您需要做的不仅仅是简单的更改来“修复”这个问题 问题在于
Image
(例如DrawOriginalSize
)的成员函数与常规函数不同-它们有一个额外的此
参数是隐式的,因此您无法“看到”该参数。这意味着常规函数指针,例如img.ipp.draw
不能是成员函数
有几种解决办法。如果在
IMAGEPROCESSINGPARAMETER
中使用draw
astd::function
,它将立即工作
或者,您需要将
Image
中的函数设置为静态-如果它们仍然需要是成员函数(即,它们使用一些成员变量),则需要设置一个静态包装函数-包装函数随后会使用一个额外的参数,即指向对象的指针,然后将其制成此指针 IMAGEPROCESSINGPARAMETER
是一个美丽的名字。我建议你仔细阅读“战略设计模式”,因为这是我认为你在这里试图实现的目标。解释一下它目前如何“不起作用”,以及你认为你应该改变哪些部分。@LightnessRacesinOrbit*以及哪些部分应该改变。@H2CO3:这是我们的工作。