Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将类回调函数分配给struct?_C++_Class_Function_Pointers_Callback - Fatal编程技术网

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
a
std::function
,它将立即工作


或者,您需要将
Image
中的函数设置为静态-如果它们仍然需要是成员函数(即,它们使用一些成员变量),则需要设置一个静态包装函数-包装函数随后会使用一个额外的参数,即指向对象的指针,然后将其制成
指针

IMAGEPROCESSINGPARAMETER
是一个美丽的名字。我建议你仔细阅读“战略设计模式”,因为这是我认为你在这里试图实现的目标。解释一下它目前如何“不起作用”,以及你认为你应该改变哪些部分。@LightnessRacesinOrbit*以及哪些部分应该改变。@H2CO3:这是我们的工作。