包含在header或cpp中 - Qt中首选的内容

时间:2013-01-04 15:48:22

标签: c++ qt header include

当我编写C ++类时,我只在标题中写入包含特定情况。我更喜欢前向声明,我相信这是C ++中的最佳实践。但Qt类通常有很多字段是标准的Qt类,它们在前向声明中编写它们似乎不是一个好主意。有一些首选方式吗? Qt有大量的文档,所以我认为它已经回答了我的问题,但我刚开始阅读它。

5 个答案:

答案 0 :(得分:5)

我的规则是头文件只包含那些定义相关头文件使用的功能的文件。

假设您在标头中有一些指针和对某些类Foo的引用,但标题从不会戳入或实例化这些对象。在这种情况下,您不需要类的定义。您所需要的只是前瞻声明。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

为此,Qt只是一个C ++库。你当然可以继续写前向声明。如果您的类变得臃肿,这可能表明您将UI(表示)和数据/逻辑代码混合在一个类中。更清晰的责任分离可以使您能够用更多更简单的类替换一些复杂的类。

答案 3 :(得分:1)

这适用于JvO - 你说

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

这些是有效的:

class Ditto;

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

那么指针在哪里?

前向声明可避免需要依赖项。这很好,因为它使编译器能够减轻链接器的一些麻烦。还要考虑许多具有该头文件的代码,并且必须打开文件,解析它们等以获得类声明。从长远来看,您可以节省时间。

前向声明只有IMO才有用 c)您的代码处于不稳定状态,您希望避免大量重新编译; d)你的班级声明很大。

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

答案 4 :(得分:0)

这始终是一种权衡;前言声明强迫你:
a)仅在其他头文件中使用指向转发类的指针;
b)在每个使用该类的.cc / .cpp文件中包含头文件。

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

前向声明是IMO仅在有用时才有用 c)您的代码处于不稳定的状态,并且您希望避免大量重新编译;
d)你的类声明是巨大的

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

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

相关问题