我只能处理最简单的情况,即只有 2 个模块A和B
A依赖于B,因此我将B构建为库并将B的头文件包含在A中,并且在构建A时也链接到B库。
当A和B相互依赖时,这将不起作用,当模块数量增加时更糟..
那么在中进行模块化开发的一般方式是c/c++
什么?
更新
对不起,似乎我的标题不准确,改写的版本是:我怎样才能将一个模块分成许多文件(.h
而.cpp
不是一个文件)?
我只能处理最简单的情况,即只有 2 个模块A和B
A依赖于B,因此我将B构建为库并将B的头文件包含在A中,并且在构建A时也链接到B库。
当A和B相互依赖时,这将不起作用,当模块数量增加时更糟..
那么在中进行模块化开发的一般方式是c/c++
什么?
更新
对不起,似乎我的标题不准确,改写的版本是:我怎样才能将一个模块分成许多文件(.h
而.cpp
不是一个文件)?
如果 A 和 B 相互依赖,则不能单独部署它们中的任何一个。因此,您实际上只有一个模块,而不是两个。(您可以重构您的模块以将通用内容提取到第三个模块 C 中,从而使 A 和 B 都依赖于 C 但不相互依赖。)
一个设计良好的项目不应包含循环模块依赖项。这保证了它的模块之间总是有一个健全的构建顺序。
如何将一个模块分成许多 .h 和 .cpp 文件(不是一个)?
基本原则与模块级别的非常相似:避免循环依赖和重复定义。@Felix 已经提到了这方面的基本工具:前向声明和包含守卫。我还可以支持@kotlinski 对拉曼书的推荐,以更深入地了解该主题。
学习好的设计需要实践,所以如果您的第一种方法看起来不完美,请不要放弃 :-) 在 C++ 中,一个特别的痛苦是更改后过度重新编译。为了尽量减少这种情况,请努力确保您最依赖的事物(类、标题)是变化最少的事物。即依赖于接口(抽象类),而不是具体的实现。
此外,努力保持逻辑分区(类/组件)和物理分区(头文件/cpp 文件)之间的健康关系。典型的方法是将每个类定义放到一个单独的头文件中,并将其实现(如果适用)放到一个单独的 cpp 文件中。但是,您可能更喜欢在单个标题中定义紧密耦合的类(组件),以强调它们的逻辑关系。
一般来说,拥有两个相互依赖的模块是一种设计味道。你可以
1) 将模块合并到一个新的 C 中,或
2) 将一个公共子集提取到 I 中,使 A 和 B 依赖于 I 但不相互依赖。
更新
使用前向声明和 #pragma once 或 #include/#ifndef 保护:
解决方案是确保您的模块形成一个有向无环图...即,如果 A 依赖于 B,请确保 B 不依赖于 A。这需要大量的纪律,但从长远来看是值得的。
如果你对这些东西感兴趣,Large Scale C++ Software Design是一本不错的读物。