C++ QT:私有成员而不是继承?原因是什么?这是一个具体的概念吗?
不久前,我用QT设计器/QT创建者编程了一个GUI。 对于这个问题,我将首先说明使用上述IDE创建GUI的一般过程的原理图: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:
UIbasisclass
)的内容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 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