c++ - 传入并存储指向对象的函数指针

标签 c++ pointers function-pointers

我正在编写一个基本的 GUI 框架作为一个学校项目,我正在尝试创建一个对象(想想一个按钮),当与之交互时,将调用一个特定的函数。

为了简单地解释我的设置,我有一个按钮类和一个窗口管理器类。窗口管理器从 main 实例化一次,许多按钮从窗口管理器实例化,所有 3 个都在单独的文件中。什么都不应该放在 main 中。

我有点 C++ 菜鸟,但据我所知,最好为此使用函数指针。我的想法是实例化我的按钮对象,然后将一个函数指针传递给一个函数,调用该函数时将编辑另一个对象。

首先,我认为最好的方法是在窗口管理器本地定义函数,否则我在访问时会遇到麻烦?我最初不想将它们列在标题中以使事情变得更容易(以期在将来创建一种拖放编辑器)。

其次,我如何将(从窗口管理器)指向函数(存在于窗口管理器中)的指针传递给按钮对象的实例?我认为我可以像对待任何其他变量一样对待它并做一些事情:

Button btn1 = new Button();
btn1->SetText("Button 1");
btn1->SetOnClick(functionpointer);

但是,在浏览了各种教程之后,我不太明白如何实现它。例如,我什至如何定义某个地方来存储我的按钮类中的函数指针?

非常感谢任何见解,我想我已经把自己搞糊涂了一天。

编辑:似乎我应该补充一点,我的 ButtonWindowManager 类在不同的文件中,我的入口点可以说是 的一个实例窗口管理器。我的 GUI 的所有设置,包括为按钮分配功能,都将在 WindowManager 的构造函数中完成。

最佳答案

这是使用函数指针的一种方法。但是使用 std::function使代码更加灵活。例如,您可以使用 lambda 表达式。 使用 std::function您可以简单地将 typedef 更改为 typedef std::function<void(Button*)> EventCallback;并添加包含 #include <functional>

#include <iostream>

class Button
{
public:
    // Typedef of the event function signature
    typedef void(*EventCallback)(Button* button);

    Button() : onClick(nullptr) {}

    // Set the function to call
    void SetOnClick(EventCallback func) { onClick = func; }
    // Call the function if exists
    void OnClick() {
        if (onClick)
            onClick(this);
    }

private:
    // This stores the function pointer for the button
    EventCallback onClick;
};

// just some example function that has the same signature as Button::EventCallback
void MyEventFunc(Button* button)
{
    std::cout << "Triggered" << std::endl;
}

int main() {
    Button button;
    button.SetOnClick(&MyEventFunc);
    button.OnClick();
    return 0;
}

http://ideone.com/x5O49B

关于c++ - 传入并存储指向对象的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34436197/

相关文章:

C 在函数中传递指针到指针

java - 像 C++ 风格的函数指针一样使用 Java Lambdas?

c++ - lambda 转换为 bool 而不是推导函数指针类型

c++ - LNK2005 和 LNK1169 错误 - C++

c++ - 在不锁定互斥锁的情况下调用 pthread_cond_signal

c++ - 如何跳过 tar 文件中的文件以获取特定文件

c++ - 可以使用 static_cast 破坏 protected 成员访问检查吗?

c - 将结构中的指针分配给变量

c++ - 如何修复 : error: no match for 'operator=' (operand types are 'Estado' and 'Estado*' )

c - 为什么这个指向函数的指针可以在没有警告或错误的情况下工作?