将类回调函数分配给结构
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/函数(如果不是),我建议您使用std::function,它会为您提供更多的表示能力,并且不太容易出错。
一般来说,如果没有令人信服的理由,那么使用这种类似c的技术是不可取的。
您需要做的不仅仅是一个简单的更改来"修复"这个问题。
问题是Image
的成员函数(如DrawOriginalSize
)与正则函数不同——它们有一个隐含的this
参数,所以你看不到这个参数。这意味着正则函数指针(如img.ipp.draw
)不能是成员函数。
有几个解决方案。如果您在IMAGEPROCESSINGPARAMETER
中将draw
设为std::function
,它将立即工作。
或者,您需要使Image
中的函数成为静态的-如果它们仍然需要是成员函数(也就是说,它们使用了一些成员变量),则需要创建一个静态包装器函数-然后包装器函数会获取一个额外的参数,即指向对象的指针,然后将其创建为this
指针。
相关文章:
- 如何在模板类函数中分配结构值?
- 在什么情况下,两个堆栈分配的结构对象的 this 点指向同一个地址?
- C++具有动态分配的字符数组的结构
- 基于浅树的数据结构的内存分配器,用于频繁分配和解除分配
- 取消引用 void 指针以将值分配给结构
- 如何为结构字段动态分配字符空间
- 使用列表进行动态结构分配
- 当我尝试为结构分配新指针时出现堆栈溢出错误
- 是否可以将结构分配给向量的索引?
- 如何将结构分配给共享内存i C
- 是否可以将基类的结构分配给派生类的结构
- 无法为结构分配内存
- 如何将结构分配给结构的指针数组
- 将一个结构分配给另一个结构会导致垃圾
- 在C++中根据需要为数据结构分配空间
- 尝试实现一个函数以删除链表中的结构,同时将它前面的结构分配给它后面的结构
- 位字段结构分配意外行为
- 如果我将一个POD结构分配给另一个POD组织,是否存在内存泄漏
- C4473结构分配警告
- 无法将结构分配给结构的指针