小编典典

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

java

免责声明: 此描述包含许多Qt细节。他们不是必须回答的问题,我只是想为您提供背景。

我需要在反应focusInEventQTextEdit。不幸的是,这不能作为信号,这就是为什么我需要subclass的原因QTextEdit。由于这是我唯一需要的更改,因此我想使用一个匿名子类

像这样:

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

这是我要用Java编写的代码,不能在c
++中编译。以下所有代码都在custom的构造函数中QWidget。将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”是“ Editor :: Editor(std :: shared_ptr):: MyTextEdit’QTextEdit
*的不可访问的基础新的MyTextEdit();

实际问题:

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


阅读 252

收藏
2020-11-30

共1个答案

小编典典

您的子类化尝试

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一样的匿名内部类这样的东西。

2020-11-30