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)
甚至有可能吗?我错过了什么吗?
答案已调整,因为 OP 已从标签列表中删除了c 。
该代码按原样工作。所以你做错了其他事情。
但是,以这种方式使用指向函数的指针可能不具有您想要的语义。如果该结构被复制到另一个结构,则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)
如果你遵循这个方法,这也会起作用。
| 归档时间: |
|
| 查看次数: |
201 次 |
| 最近记录: |