4

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

4

5 回答 5

5

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

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

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

于 2013-01-04T16:29:54.027 回答
2

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

于 2013-01-04T16:09:23.207 回答
1

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

于 2013-01-04T16:04:43.230 回答
1

这是给 JvO - 你说

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

这些是有效的:

class Ditto;

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

那么指针在哪里呢?

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

前向声明仅在以下情况下才有用 IMO c) 您的代码处于不断变化的状态,并且您希望避免大量重新编译;d) 你的类声明很大。

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

于 2013-01-04T16:30:45.690 回答
0

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

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

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

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

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

于 2013-01-04T16:11:04.117 回答