3

如果我有一个项目

main .cpp 
Knife .h and .cpp
Cucumber .h and .cpp 

并且我想在 Cucumber 中使用 Knife 的成员,是否使用以下内容是否重要:

#include "Knife.h"
#include <iostream>
using namespace std;

在 Cucumber.h 或 Cucumber.cpp 中(假设 Cucumber.cpp 已经包含 Cucumber.h)?

4

4 回答 4

3

我的建议是尽量减少头文件中包含的文件数量。因此,如果可以选择,我更喜欢包含在源文件中。

修改头文件时,必须重新编译包含该头文件的所有文件。

因此,如果cucumber.h包含knife.hmain.cpp包含cucumber.h,并且您修改knife.h,所有文件都将被重新编译(cucumber.cppknife.cppmain.cpp

如果cucumber.cppincludeknife.hmain.cppincludes ,而cucumber.h你修改knife.h, 只会重新编译,这样你的编译时间就减少了。cucumber.cppknife.cpp

如果您需要在黄瓜中使用刀,您可以这样进行:

// Cucumber.hpp
#ifndef CUCUMBER_HPP
#define CUCUMBER_HPP

class Knife;

class Cucumber
{
public :
///...
    private :
    Knife* myKnife
}
#endif

//Cucumber.cpp
#include "Cucumber.hpp"
#include "Knife.hpp

// .. your code here

这个“技巧”被称为“前向声明”。这是 C++ 开发人员众所周知的技巧,他们希望最大限度地减少编译时间。

于 2012-08-14T11:33:39.220 回答
2

是的,你应该把它放在.cpp文件中。

您将拥有更快的构建、更少的依赖项以及更少的工件和噪音——在 iostream 的情况下,GCC 声明:

// For construction of filebuffers for cout, cin, cerr, clog et. al.
static ios_base::Init __ioinit;

在命名空间内stdKnife.h该声明将产生大量(冗余)静态数据,如果包含在许多文件中,则必须在启动时构建这些数据。所以有很多胜利,唯一的损失是你必须明确地包含你实际需要的文件——你需要它们的每个地方(这在某些方面也是一件非常好的事情)。

于 2012-08-14T11:41:02.920 回答
1

我所看到的建议是只包含给定源文件所需的最低限度,并尽可能多地包含在标题之外。在编译时,它可能会减少依赖关系。

要注意的另一件事是您的命名空间使用情况。您肯定要小心在标题中包含此类内容。它可能会更改您未计划的文件中的命名空间使用情况。

于 2012-08-14T11:34:46.087 回答
1

作为一般规则,尝试将您的包含添加到实现文件而不是标头中,原因如下:

  • 减少潜在的不必要的包含,并将其保留在需要的地方。
  • 减少编译时间(在我见过的某些情况下相当显着。)避免过度暴露实现细节。
  • 降低出现循环依赖的风险。
  • 避免将您的标头用户锁定为不得不间接包含他们可能不想要/不需要的文件。

如果您通过指针引用类或仅在标题中引用,则无需包含适当的标题;一个类声明就足够了。

可能还有很多其他原因 - 以上可能是最重要/最明显的原因。

于 2012-08-14T11:46:53.513 回答