QT:私人会员而不是继承?是什么原因?这是一个特定的概念吗?

时间:2017-04-06 12:46:46

标签: c++ qt inheritance private-members

前段时间我用QT Designer / QT Creator编写了一个GUI。 对于这个问题,我将首先说明如何使用上述IDE创建GUI的一般过程的原理图:

  1. 使用QT Designer创建设计 - >获取.ui文件
  2. .ui文件被翻译成头文件,你特别喜欢“UIbasisclass.h”(类UIbasisclass)。
  3. 您创建类似“UIsubclass.h”(类UIsubclass)的内容,自己创建一个私有成员UIbasisclass ui
  4. 班级UIsubclass内的代码:

    ...
            private:
    
           Ui::UIbasisclass ui;
    ...
    

    最后,您将在main方法中创建UIsubclass的对象 - >代码:

    ...
        UIsubclass *MyGUI = new UIsubclass();
    ...
    

    其中UIsubclass的构造函数包含以下代码:

    ...
        ui.setupUi(this); 
    ...
    

    简而言之:我们有一个UIsubclass主要负责应用方法,但也有UIbasisclass的私有成员,名为ui,主要由设计代码组成。 当我们创建UIsubclass的对象时,其私有成员UIbasisclass uiUIsubclass的构造函数中初始化,其对象为UIsubclass本身(?)。 [见:这个指针]

    我现在的问题是:

    1. 为什么UIsubclass继承UIbasisclass的方式没有使用继承?相反,UIbasisclass的一个对象成为UIsubclass的成员。

    2. 这是一个特定的有利概念(如果是,它有哪些优点或如何命名?)或“仅仅”是QT代码结构的必要性?

    3. 如果我必须指出我的问题或是否有任何问题,请告诉我。

3 个答案:

答案 0 :(得分:2)

您可以使用私有继承,甚至可以在Qt documentation中记录。

由于Qt Creator使用了模板,因此默认使用ui的私有成员,Qt本身并不关心。

答案 1 :(得分:1)

  

为什么UIsubclass继承UIbasisclass的方式没有使用继承?

您问我们为什么您没有在自己的代码中执行此操作?去做就对了。它取决于你。它确实是您的代码。 负责其设计。如果您正在使用模板,那么它可以帮助您入门,但不会为您设计软件。责任在于你,而你的责任只有你自己。

  

它"只是" QT代码结构的必要性?

没有这种必要性。 Ui类是一个POD类,带有一堆指针和一个方法。没什么好看的。如果你想私下继承它:马上就行。

答案 2 :(得分:1)

因为使用私有成员,您可以转发声明生成的类:

namespace Ui {
    class MyForm;
}

class Foo {
private:
    Ui::MyForm *ui;    
};

并在.cpp文件中插入include。

这样,此文件的所有可能包含都不必再次预处理该文件。