[英]Assign class callback function to struct?
最近,我了解了回調函數,我想在我的應用程序中實現它。 這里是我到目前為止所得到的。
// 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
)與常規函數不同-它們具有一個附加的this
參數, this
參數是隱式的,因此您不會“看到”該參數。 這意味着常規函數指針(例如img.ipp.draw
不能成為成員函數。
有一些解決方案。 如果在IMAGEPROCESSINGPARAMETER
draw
std::function
,它將立即起作用。
或者,您將需要使Image
的函數靜態化-如果它們仍然需要成為成員函數(即,它們正在使用某些成員變量),則需要使靜態包裝器函數-然后包裝器函數需要額外的一個參數,它是指向對象的指針,然后將其制成this
指針。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.