如何在头文件中组织代码实体

  • 本文关键字:代码 实体 文件 c++ header
  • 更新时间 :
  • 英文 :


可能的重复项:
使用C++头文件的
最佳做法 C++ - .h文件中应该包含哪些内容?

我知道这可能是一个微不足道的问题,但我真的很困惑。

  • 应如何在头文件中组织代码实体?

例如,将每个类声明放在头文件中。全球实体怎么样?我是否需要将每个声明放在不同的文件中?或者把一些相关的放在一个文件中?还是其他一些原则来确定它?

例 1

// A common header file of "common.h"
#include <vector>
#include <memory>
#include <algorithm>
#include <string>
#include <cmath>

或者只是在需要时包含它们。

例 2

// A header file "report.h" to include functions to report some information
class string;
void Log(std::string& info); // show in a log window
void Message(std::string& info); // show in a message box
void Status(std::string& info); // show in a status bar

或将它们拆分为 3 个文件。

首先要记住的是,标头供其他文件使用;它应该只包含某些服务的使用者使用该服务所需的信息。 单个源文件中的程序不需要标头(对于它定义的函数;不过,它将用于它使用的"系统"函数)。 标头用于确保服务提供者和服务使用者之间的一致性。

[你]把每个类声明都放在一个头文件中吗?

不。 很多类,但肯定不是每个类。

如果类仅由源文件中的代码使用,则文件外部的任何内容都不需要知道该类。 应在源文件中指定类,而不是在标头中指定。

即使在接口中使用了类,也要仔细考虑是否需要详细的声明,或者是否足以提供类的前向声明。

全球实体怎么样?

除了函数之外,您不应该有很多"全局实体"。 尽可能避免全局变量。 如果其他文件需要全局实体,则应在适当的标头中声明它,通常但不总是定义它所属类的标头。 如果仅在单个文件中需要"全局实体",则应在适当的命名空间(通常是匿名命名空间)中定义它。

我是否需要将每个声明放在不同的文件中?

不。 你把它们组合在一起。 考虑标准C++库。 许多标头定义多个声明。 但是每个标头都定义了一组相关的声明。 您希望在将所有内容分成不同的标题和拥有太多标题之间取得平衡,您找不到任何东西。

第一个经验法则是"每个定义服务的源文件一个标头"。 不过,必须明智地使用它。

如果需要多个源文件来实现完整的服务集,

则单个标头可以为完整的服务集提供外部定义(并且可能会有第二个专用标头仅由实现服务的源文件使用,定义它们需要在它们之间共享的详细信息, 不与消费者共享)。

在另一个极端,有时源文件将实现几组服务。 如果这些服务没有密切联系——糟糕的工程设计,那将是不寻常的。 如果它们是相关的,那么单个标头就足够了。 我想一个源文件可以有两个公共头,但这种情况非常不寻常。

最新更新