gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:53:24 25 4
gpt4 key购买 nike

我正在制作一个 allegro 游戏,其中按钮类应该是独立的,因此我将函数指针放在 OnClick 事件的按钮对象中。在项目的推进过程中,我一直在将全局函数放入 MyButton 构造函数的参数中,并且一切正常 - 当我尝试在那里传递 Node::OnClick() 时出现了问题:

节点.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();
};

我的按钮.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);

一旦我像这样将 &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)'

最佳答案

你的 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);

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

关于C++ 传递动态方法指针作为不同类的方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18032432/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com