C ++将动态方法指针作为不同类的方法参数传递

时间:2013-08-03 11:36:16

标签: c++ class oop function-pointers

我正在制作一个快门游戏,其中按钮类应该是独立的,所以我将函数指针放在按钮对象的OnClick事件中。通过该项目的进展我一直把全局函数放在MyButton构造函数的参数中,一切正常 - 当我尝试在那里传递Node :: OnClick()时出现问题:

Node.h:

class Node {
private:
    static int _id;
    int id;
    bool active;
    std::vector<Node*> neighbours;
    std::vector<bool> mask;
public:
    Node();
    int getId();
    void addNeighbour(Node* neighbour);
    void OnClick();
    void Check();
    void Uncheck();
    bool isActive();
};

MyButton.h:

class MyButton {
private:
    MyRectangle* boundingBox;
    ALLEGRO_BITMAP* image;
    void (*onClick)(void);
public:
    MyButton();
    MyButton(ALLEGRO_BITMAP* img, MyRectangle* boundingBox, void (*onClick)(void)); 
    MyButton(ALLEGRO_BITMAP* img, int x, int y, void (*onClick)(void)); 
    void Draw();
    void clickCheck(int x, int y);
};

主:

Node* current = graph->getNode(i);
buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, current->OnClick);

错误:

error C3867: 'Node::OnClick': function call missing argument list; use '&Node::OnClick' to create a pointer to member

这段代码执行得很好:

buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, &testOnClick);

一旦我把&amp; Node :: OnClick放到这样的ctor参数中:

buttons[i] = new MyButton(scarab1, button_coords[0]-27, button_coords[1]-27, &Node::OnClick);

然后我得到了:

main.cpp(135): error C2664: 'MyButton::MyButton(ALLEGRO_BITMAP *,int,int,void (__cdecl *)(void))' : cannot convert parameter 4 from 'void (__thiscall Node::* )(void)' to 'void (__cdecl *)(void)'

1 个答案:

答案 0 :(得分:3)

您的Node::OnClick功能属于void (Node::*)(void)类型。

您可能需要考虑使用mem_fn。 (或mem_fun取决于您可以使用的内容。mem_fun已被弃用,已被mem_fn替换

在这种情况下,

mem_fn(&Node::OnClick)将返回类型为void (*)(void)的函数指针。 (技术上未指明类型。)

哎呀,此时我建议忘记函数指针并查看std::function


好的,这里的std::function替代方案会更清晰:

// Pass *current here
auto fn = std::bind(&Node::OnClick, class_instance);

上面的行将从绑定到类实例的成员函数中返回一个可调用对象。将其传递给您的函数,但不使用函数指针,而是使用std::function<void(void)>