C++ 分配给';void(*)(int)和#x27;来自不兼容类型';无效(按钮::*)(int)和#x27;
我试图设置一个指向另一个类的成员函数的指针,但我不知道该怎么做。我有三个类:控件、按钮、文本框。按钮和文本框有自己的void _Draw(),控件类有一个指向void(*drawFunc(int))的指针 我希望Button和Textbox类都可以访问Control _drawFunc指针,将其设置为它们的_Draw函数C++ 分配给';void(*)(int)和#x27;来自不兼容类型';无效(按钮::*)(int)和#x27;,c++,class,pointers,C++,Class,Pointers,我试图设置一个指向另一个类的成员函数的指针,但我不知道该怎么做。我有三个类:控件、按钮、文本框。按钮和文本框有自己的void _Draw(),控件类有一个指向void(*drawFunc(int))的指针 我希望Button和Textbox类都可以访问Control _drawFunc指针,将其设置为它们的_Draw函数 void Draw1(int t) { printf("%d\n", t); } struct Control { void (*drawFunc)(int
void Draw1(int t) {
printf("%d\n", t);
}
struct Control {
void (*drawFunc)(int);
Control() {}
};
struct Button : Control{
void _Draw(int m) {
// ...
}
Button() {
drawFunc = &Button::_Draw; // Draw1 works fine
}
};
struct Textbox : Control{
void _Draw(int m) {
// ...
}
Textbox() {
drawFunc = &Textbox::_Draw; // Draw1 works fine
}
};
您可以使用
函数drawFunc
而不是void(drawFunc*)(int)
,并使用[this](inti){this->\u Draw(m);}
对其进行绑定,或者将其设为静态(这没有意义),但对于此类问题,存在虚拟方法:
struct Control {
virtual void draw(int) = 0;
Control() {};
virtual ~Control() {};
};
struct Button : public Control {
void draw(int m) final override { // final is optional: if there are no subclasses of buttons
// ...
};
};
void(*drawFunc)(int)
不是指向成员函数的指针。它是指向常规(独立)函数的指针。成员函数和正则函数具有完全不同的性质。您不能使drawFunc
指向按钮::\u Draw
。指向函数的指针和指向成员函数的指针是不同的类型。还要注意,以\u
开头,后跟A-Z
的名称是保留的,不应该使用。^不仅不应该,也不能@SJBar——如果您仔细考虑一下,您将如何使用常规的函数调用语法指针来调用该成员函数?要正常调用非静态成员函数,需要一个对象,即object.foo()
或object->foo()
。那么,如何将object
放入您熟悉的函数调用语法指针中呢?没错,你不能,不同的动物,如前所述。