C++:为事件处理程序创建匿名类

2023-11-29

免责声明:该描述包含许多 Qt 细节。他们没有必要回答这个问题,我只是想给你介绍一下背景。

我需要对此做出反应focusInEvent of a QTextEdit。 不幸的是,这不能作为信号使用,这就是为什么我需要子类化QTextEdit。由于这是我需要的唯一更改,因此我想使用匿名子类

像这样:

myTextEdit =new QTextEdit(){
            void focusInEvent(){
     //code here
     }
};

这是我用 Java 编写的代码,它不能用 C++ 编译。 以下所有代码都在自定义的构造函数内QWidget. The QTextEdit包含在此小部件中,应在其构造函数中初始化。

奇怪的是,这段代码编译后:

class MyTextEdit:protected QTextEdit{
    void focusInEvent();
};
auto myTextEdit=new MyTextEdit();

但没用,因为我无法分配一个实例myTextEdit*指向一个指针QTextEdit。不知何故,多态性失败了。此代码无法编译:

class MyTextEdit:protected QTextEdit{
        void focusInEvent();
    };
QTextEdit* myTextEdit=new MyTextEdit();

编译器错误是:

/home/lars/ProgrammierPraktikum/moleculator/implementation/Moleculator/gui_elements/editor.cpp:40: 错误:“QTextEdit”是无法访问的基础 '编辑器::编辑器(std::shared_ptr)::MyTextEdit' QTextEdit* myTextEdit=new MyTextEdit();

实际问题:

如何创建与其超类的指针兼容的匿名子类?


您的子类化尝试

class MyTextEdit:protected QTextEdit{
        void focusInEvent();
    };
QTextEdit* myTextEdit=new MyTextEdit();

差不多就可以了

仅仅因为该方法受保护并不意味着您应该使用 protected 进行继承。

  • 受保护的方法说:这不是我的界面的一部分。除了我之外没有人可以这么称呼。我自己称之为(作为事件处理的一部分)。该方法可以在子类中被重写。
  • 继承受保护说:没有人应该知道这个继承,它是一个实现细节,可能对扩展我的类有用。

你想要常规的公共继承。

class MyTextEdit:public QTextEdit{
        void focusInEvent();
    };
QTextEdit* myTextEdit=new MyTextEdit();

现在您说 MyTextEdit 是 QTextEdit 的替代品。 您可能想要添加一个构造函数来向 MyTextEdit 提供父窗口小部件。

C++中不存在类似java的匿名内部类这样的东西。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++:为事件处理程序创建匿名类 的相关文章

随机推荐