gpt4 book ai didi

c++ - 向类及其所有子类添加功能

转载 作者:行者123 更新时间:2023-11-30 04:16:55 26 4
gpt4 key购买 nike

我有 3 个类继承自 3 个不同的类,这些类都继承自 QWidget 基类。例如:

  1. MyMainWindow : public QMainWindow : public QWidget
  2. MyPushButton : public QPushButton : public QWidget
  3. MyTextEdit:公共(public) QTextEdit:公共(public) QWidget

我最终会开设更多这样的类(class)。我现在想做的是为我所有的类添加一个通用方法;这意味着它应该被添加到 QWidget 基类中,但我无法编辑它(我宁愿不更改一种方法的 Qt 源代码)。

这种行为可能吗?我已经尝试过使用这样的界面:

class MyTextEdit : public QTextEdit, IMyMethodContainer { ... };

但问题是,我需要在 IMyMethodContainer 中访问 QObject::connect(sender, signal, this, slot);,并通过 this 我正在尝试访问 MyTextEdit,而不是 IMyMethodContainer,它不是 QWidget 的子类。

最佳答案

CRTP 可能会有所帮助。

template<typename Derived, typename Base>
struct InjectMethod: Base {
static_assert( std::is_base_of< InjectMethod<Derived,Base>, Derived >::value, "CRTP violation" );
Derived* self() { return static_cast<Derived*>(this); }
Derived const* self() const { return static_cast<Derived*>(this); }
void my_method() {
// use self() inside this method to access your Derived state
}
};

然后:

class MyTextEdit: InjectMethod< MyTextEdit, QTextEdit > {
};
class MyPushButton: InjectMethod< MyPushButton, QPushButton > {
};

内部InjectMethod< MyTextEdit, QTextEdit >你可以访问 self()可以访问内部所有内容的指针 MyTextEdit , 和里面 InjectMethod< MyPushButton, QPushButton >一样。

您可能不需要 Derived部分——如果您只使用 QWidget,可能只有一个模板参数(您的基础)就足够了功能。

关于c++ - 向类及其所有子类添加功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17454496/

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