如何创建指向函数指针的指针?

Raf*_*nel 5 c++ struct pointers function

我正在尝试创建一个具有 2 个函数的结构,如果以后需要可以重写它。函数是:onClicked() 和 onClickedRight()。结构体的代码:

typedef struct {
    QString text;
    QString infoText;
    QUrl iconSrc;
    QColor iconColor;
    void (*onClicked)() = nullptr;
    void (*(*onClickedRight))() = &onClicked; // by default, execute the same function from onClicked()
} ConfigButton;
Run Code Online (Sandbox Code Playgroud)

我如何尝试执行这些功能:

ConfigButton b;
...
// test if click funtion has been defined, to execute it
if (b.onClicked)
    b.onClicked(); // this one work just fine

...

if (*(b.onClickedRight))
    (*(b.onClickedRight))(); // this one crashed
Run Code Online (Sandbox Code Playgroud)

甚至有可能吗?我错过了什么吗?

jxh*_*jxh 1

答案已调整,因为 OP 已从标签列表中删除了

该代码按原样工作。所以你做错了其他事情。

但是,以这种方式使用指向函数的指针可能不具有您想要的语义。如果该结构被复制到另一个结构,则onClickedRight副本中的成员不会指向onClicked其自己实例中的指针。相反,它指向onClicked原始实例的指针。

a.onClickedRight = &a.onClicked;
b = a;
assert(b.onClickedRight == &a.onClicked); // Is this intentional?
Run Code Online (Sandbox Code Playgroud)

这意味着您必须格外小心如何使用包含指向其自身成员的指针(实际上是指向任何内容的指针)的结构。您可能需要某种深度复制方法(因此,根据TRoT,您需要一个复制构造函数、一个赋值运算符和一个析构函数)。

无论如何,C++ 代码并不是真正地道的。对于我自己来说,我可能会利用虚拟方法。虚拟方法语法可以轻松适应这种用例。

struct ConfigButton {
    QString text;
    QString infoText;
    QUrl iconSrc;
    QColor iconColor;
    virtual void onClicked() const = 0;
    virtual void onClickedRight () const { onClicked(); }
};

struct Foo : ConfigButton {
    void onClicked () const {
        //...
    }
};
Run Code Online (Sandbox Code Playgroud)

如果你遵循这个方法,这也会起作用。