C ++标头仅包含模式

时间:2011-10-13 13:09:59

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

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

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

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

  • 我尽可能使用前向延迟。
  • 每个我的.hpp文件都包含#pragma once。
  • 但是,当我的项目增长到40-50个班级时,我看到了包含图形的问题。定义有一些错误。

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

include graph

如何包含图形应该是什么样的?像树一样? 如何不手动编写包括C#或Java?

4 个答案:

答案 0 :(得分:11)

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

如果你想编写惯用的Java,只需用Java编写即可。如果你不想使用C ++语言,你必须在其约束条件下工作。

答案 1 :(得分:1)

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

对于#include子句,我担心你必须手动编写它们。但是,如果你的课程足够小,这应该不是问题(如果你的课程如此庞大,你无法弄清楚你需要什么,你有设计问题)。

答案 2 :(得分:1)

就像一个小注释一样,将类拆分为.cpp.h文件不仅可以解决循环依赖问题,而且可能会大大增加编译时间。

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

仅限标题代码只有在设计基于模板的库时才有意义,因为模板驻留在标题中。例如,请参阅boost template library。还要提到的是,使用模板库的真实应用程序仍然为其代码提供了.cpp个文件,而实例化的模板实际上是“used”。

答案 3 :(得分:1)

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

在头文件中更改内联函数时,将重新编译包含头文件的所有源文件。在源文件中更改函数时,只需要重新编译源文件。

在创建内联函数之前,使代码正常且健壮地运行。

另一个建议是为源文件制作库(目标文件集合),这些源文件按主题分组或不经常编译(即它们工作且不会更改)。

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