我正在制作一个快门游戏,其中按钮类应该是独立的,所以我将函数指针放在按钮对象的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)'
答案 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)>
。