【问题标题】:C++ header-only include patternC++ 仅标头包含模式
【发布时间】:2011-10-13 13:09:58
【问题描述】:

我想在 .hpp 中编写代码,而不分离 .h 和 .cpp

  • 我做到了。我仅将 .cpp 用于静态类字段定义

我不想手动编写#include ...

  • 我尽可能使用转发声明。
  • 我的每个 .hpp 文件都包含一次 #pragma。
  • 但是,当我的项目增长到 40-50 个类时,我看到了包含图的问题。定义有一些错误。

附加了我的项目模型的包含图(如 mvc 的一部分)的图像。
我使用this app 生成图形(可以在没有 MSVS 的情况下工作!)。

包含图应该是什么样子?像一棵树?
如何不手动编写包含,例如在 C# 或 Java 中?

【问题讨论】:

    标签: c++ graph header include header-only


    【解决方案1】:

    很遗憾,您可能使用了错误的语言。当您将类定义与实现分开时,有些事情在 C++ 中要容易得多。即使使用前向声明,您可能仍然会遇到循环依赖,只能通过将实现移动到单独的文件中来解决。

    如果您想编写惯用的 Java,只需用 Java 编写即可。不幸的是,如果您想使用 C++ 语言,则必须在其限制范围内工作。

    【讨论】:

    • 但它可以将接口和实现分开而不是定义和实现,并且可以使用接口而不是前向声明。它更面向对象...
    • @k06a,您不必二选一。如果接口对您的应用程序有用 - 使用它们,但在任何一种情况下都将您的类分为标头和实现。
    • 长话短说:不要使用 C++ 编写 Java。
    【解决方案2】:

    假设每个类都有一个 .hpp 文件,那么包含图类似于类依赖图。 为了可重用性,类依赖图应该是非循环的(您可以通过使用接口来“拆分”循环来实现这一点)。 所以,我猜包含图也应该是非循环的。

    至于#include 子句,恐怕您必须手动编写它们。但是如果你的类足够小,这应该不是问题(如果你的类太大而你无法弄清楚你需要什么,那么你就有设计问题了)。

    【讨论】:

    • 很快我在单个头文件中就有了 2-3 个类似(带有单个接口)的类,今天我将它们拆分为不同的头文件。
    • @k06a 为文件设置一个类是一个不错的选择。除了帮助包含依赖之外,如果使用类名作为文件名,查找类会更简单。
    【解决方案3】:

    请注意,将类拆分为 .cpp 和 .h 文件不仅可以解决循环依赖问题,而且还可能会显着增加编译时间。

    如果您尝试编写仅包含标头的代码,即使一小部分代码被更改,您最终也可能会完全重建您的项目。

    只有在您设计基于模板的库时,仅标头代码才有意义,基本上,因为模板应该驻留在标头中。例如,请参阅boost template library。还要提一下,使用模板库的实际应用程序仍然有那些 .cpp 文件作为他们的代码,这就是实例化模板实际“使用”的地方。

    【讨论】:

    • 完全重建项目对我来说并不难。项目没有那么大。可以使用多线程编译(4 倍或 8 倍加速)。
    【解决方案4】:

    我强烈建议将实现放入“.cpp”文件,将声明或接口放入头文件“.hpp”中。

    当头文件中的内联函数发生变化时,包含该头文件的所有源文件都将被重新编译。当源文件中的函数发生变化时,只需要重新编译源文件。

    在创建内联函数之前让代码正确且稳健地运行。

    另一个建议是为按主题分组或不经常编译的源文件创建库(目标文件集合)。

    不用担心文件的数量和构建过程的长度。专注于正确、稳健和按计划完成项目。根据需要调整构建过程。如果计划中有很多时间代码工作正常且健壮,则进行更改。如果更改构建过程可以“显着”加快开发时间,那么进行更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多