包括在头或cpp -什么是首选的Qt

Include in header or cpp - what is preferred in Qt

本文关键字:Qt 什么 cpp 包括      更新时间:2023-10-16

当我写一个c++类时,我只在特定的情况下在header中写include。我更喜欢前向声明,我相信这是c++的最佳实践。但是Qt类经常有很多字段是标准的Qt类,把它们都写在前向声明中似乎不是一个好主意。有什么更好的方法吗?Qt有庞大的文档,所以我认为它已经回答了我的问题,但我刚刚开始阅读它。

我的规则是头文件只包含那些定义了有问题的头文件使用的功能的文件。

假设您在头文件中有指向某些类Foo的指针和引用,但头文件从未插入或实例化这些对象。在这种情况下,您不需要类的定义。你所需要的只是一个前向声明。

另一方面,如果插入类型为Foo的对象,或者具有类型为Foo的数据成员或变量,则前向声明是不够的。现在您确实需要完整的定义,所以现在是时候#include定义类Foo的头文件了。(或者,如果使用在内联函数定义中,您可能需要重新考虑内联并将实现放在单独的源文件中。)

头文件只是说"我们能做什么"。cpp文件说"我们可以这样做,这就是我们的意图"。

Qt,出于这个目的,只是一个c++库。您当然可以继续编写forward声明。如果您的类变得臃肿,这可能表明您在一个类中混合了UI(表示)和数据/逻辑代码。更清晰的职责分离可能使您能够用大量更简单的类替换一些复杂的类。

这是JvO -你说

这总是一种权衡;前向声明迫使您:A)在其他头文件中只使用指向你转发的类的指针;B)在每一个使用该类的.cc/.cpp文件中包含头文件

class Ditto;
Ditto letsHaveANewOne();
void useIt(Ditto X);

那么指针在哪里?

Forward声明避免了依赖关系的需要。这很好,因为它使编译器可以将一些麻烦转移给链接器。还要考虑许多具有头文件的代码,并且必须为类声明打开文件,解析它们等。从长远来看,你节省了时间。

前向声明在IMO中只有在以下情况下才有用C)你的代码处于不断变化的状态,你想避免大量的重新编译;D)你的类声明太大

见上文-它也被称为解耦。试试吧——从长远来看会节省时间的。

这总是一种权衡;前向声明强制您:
A)在其他头文件中只使用指向你转发的类的指针;
B)在每一个使用该类的.cc/.cpp文件中包含头文件。

两者有时都有点麻烦;特别是a)你不能使用或返回对你转发的声明类的引用,b)在你的c++文件中键入并生成一长串#include是很烦人的。

前向声明只有在
C)你的代码处于不稳定状态,你想避免大量的重新编译;
D)你的类声明太大

点c)不适用于Qt(假设您不每天更新库)。D)确实适用,但如果你的编译器支持,可以通过使用预编译头文件来缓解。

Qt(至少4.7)没有捆绑的向前声明,除了QtContainerFwd中的容器(list, set, map等)。如果您发现自己一遍又一遍地输入相同的前向声明列表,您可能需要考虑使用这些声明创建自己的头文件。