我正在尝试创建一个具有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;
我如何执行这些功能:
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
可能吗 我想念什么吗?
调整了答案,因为OP已从标签列表中删除了c。
该代码按原样工作。因此,您在做其他错误的事情。
但是,以这种方式使用指向函数的指针的指针可能没有所需的语义。如果将结构复制到另一个结构,则onClickedRight
副本中的成员不会指向onClicked
其自己实例中的指针。相反,它指向onClicked
原始实例的指针。
a.onClickedRight = &a.onClicked;
b = a;
assert(b.onClickedRight == &a.onClicked); // Is this intentional?
这意味着您必须格外小心如何使用包含指向其自身成员的指针(以及实际上指向任何内容的指针)的结构。您可能需要某种深度复制方法(因此,根据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 {
//...
}
};
如果您遵循此方法,这也将起作用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句