Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QT:私有成员而不是继承?原因是什么?这是一个具体的概念吗?_C++_Qt_Inheritance_Private Members - Fatal编程技术网

C++ QT:私有成员而不是继承?原因是什么?这是一个具体的概念吗?

C++ QT:私有成员而不是继承?原因是什么?这是一个具体的概念吗?,c++,qt,inheritance,private-members,C++,Qt,Inheritance,Private Members,不久前,我用QT设计器/QT创建者编程了一个GUI。 对于这个问题,我将首先说明使用上述IDE创建GUI的一般过程的原理图: 使用QT设计器->Get.ui文件创建设计 ui文件被转换为头文件,您尤其会得到类似“UIbasisclass.h”(classUIbasisclass)的内容 您可以创建类似“UIsubclass.h”(使用classUIsubclass)的东西,自己创建一个私有成员UIbasisclass ui 类内代码UIsubclass: ... private:

不久前,我用QT设计器/QT创建者编程了一个GUI。 对于这个问题,我将首先说明使用上述IDE创建GUI的一般过程的原理图:

  • 使用QT设计器->Get.ui文件创建设计
  • ui文件被转换为头文件,您尤其会得到类似“UIbasisclass.h”(class
    UIbasisclass
    )的内容
  • 您可以创建类似“UIsubclass.h”(使用class
    UIsubclass
    )的东西,自己创建一个私有成员
    UIbasisclass ui
  • 类内代码UIsubclass

    ...
            private:
    
           Ui::UIbasisclass ui;
    ...
    
    最后,您将在main method->code中创建一个
    UIsubclass
    对象:

    ...
        UIsubclass *MyGUI = new UIsubclass();
    ...
    
    其中UIsubclass的构造函数由以下代码组成:

    ...
        ui.setupUi(this); 
    ...
    
    简而言之:我们有一个
    UIsubclass
    ,主要负责应用程序方法,但也有一个名为
    ui
    UIbasisclass
    私有成员,该成员主要由设计代码组成。 当我们创建
    UIsubclass
    的对象时,它的私有成员
    UIbasisclass ui
    UIsubclass
    的构造函数中初始化,对象为
    UIsubclass
    本身(?)。[请参阅:此指针]

    我现在的问题是:

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

  • 这是一个特定的优势概念(如果是的话,它有哪些优势,或者它是如何命名的?)还是“仅仅”QT代码结构的必要性


  • 如果我必须指定我的问题或有任何问题,请告诉我。

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


    用户界面使用私有成员是默认的,因为Qt Creator使用的模板,Qt本身并不在意。

    您可以使用私有继承,它甚至在中有文档记录

    用户界面使用私有成员是默认的,因为Qt创建者使用的模板,Qt本身并不关心

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

    你在问我们为什么你没有用你自己的代码来做?想做就做这取决于你。它确实是你的代码对其设计负责。如果您使用的是模板,它可以帮助您入门,但不是为您设计软件。责任是你的,也是你唯一的责任

    它“只是”QT代码结构的必要性

    没有这种必要。
    Ui
    类是一个POD类,包含一组指针和一个方法。没什么大不了的。如果你想从中私自继承遗产,那就去吧

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

    你在问我们为什么你没有用你自己的代码来做?想做就做这取决于你。它确实是你的代码对其设计负责。如果您使用的是模板,它可以帮助您入门,但不是为您设计软件。责任是你的,也是你唯一的责任

    它“只是”QT代码结构的必要性


    没有这种必要。
    Ui
    类是一个POD类,包含一组指针和一个方法。没什么大不了的。如果您想从它进行私有继承:请继续。

    因为有了私有成员,您可以向前声明生成的类:

    namespace Ui {
        class MyForm;
    }
    
    class Foo {
    private:
        Ui::MyForm *ui;    
    };
    
    并在.cpp文件中插入include


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

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

    namespace Ui {
        class MyForm;
    }
    
    class Foo {
    private:
        Ui::MyForm *ui;    
    };
    
    并在.cpp文件中插入include


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

    你说得对。我应该先查看QT文档,没有考虑到这种可能性。关于我的问题有很多信息。我只是核对一下这些信息,然后把你的答案标记为解决方案你是对的。我应该先查看QT文档,没有考虑到这种可能性。关于我的问题有很多信息。我将检查这些信息,然后将您的答案标记为解决方案这些天,这对小项目来说没有多大关系,对于大项目,您需要预编译头或unity builds或PIMPL来保留稳健的设计,它不会因为稍微加快构建时间而降低运行时性能。您必须首先拥有显示出这一好处的编译时度量,然后才仔细选择如何加快调试构建,因为这可能是您关心的问题。事实并非如此,因为您可能会有许多其他成员与
    ui
    成员分离。PIMPL意味着所有隐私都是隐藏的,而不仅仅是一件事。只有将所有其他成员也放入
    Ui::MyForm
    中,它才是PIMPL。我并不是说这一定是个坏主意:如果您愿意,您的PIMPL类当然可以从
    Ui::MyForm
    派生。或者它可以有
    Ui::MyForm
    作为一个成员。现在,这对于小项目来说无关紧要,对于大项目来说,你需要预编译的头文件或unity构建或PIMPL来保留一个合理的设计,它不会仅仅为了获得稍微快一点的构建时间而降低运行时性能。您必须首先拥有显示出这一好处的编译时度量,然后才仔细选择如何加快调试构建,因为这可能是您关心的问题。事实并非如此,因为您可能会有许多其他成员独立于t