簡體   English   中英

分配類回調函數到結構?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM