C++ 分配给';void(*)(int)和#x27;来自不兼容类型';无效(按钮::*)(int)和#x27;

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 _Draw(),控件类有一个指向void(*drawFunc(int))的指针

我希望Button和Textbox类都可以访问Control _drawFunc指针,将其设置为它们的_Draw函数

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
放入您熟悉的函数调用语法指针中呢?没错,你不能,不同的动物,如前所述。