当只有2个模块A和B时,我只能处理最简单的情况
A依赖于B,因此我将B构建为库并在A中包含B的头文件,在构建A时也链接到B库.
当A和B相互依赖时,这将不起作用,当模块数量增加时更是如此.
那么进行模块化开发的一般方法是c/c++什么?
UPDATE
对不起,似乎我的标题是不正常的,重新版本的版本是:如何将模块分成多个.h和.cpp文件(不是一个)?
如果A和B是相互依赖的,则不能单独部署它们中的任何一个.因此,您实际上只有一个模块,而不是两个模块.(可以重构您模块虽然提取共同的东西到第三模块C,从而使A和B都依赖于C,但不在彼此之上.)
精心设计的项目不应包含循环模块依赖性.这可以保证模块之间始终存在合理的构建顺序.
如何将模块划分为多个.h和.cpp文件(不是一个)?
基本原理非常类似于模块级别:避免循环依赖和重复定义.@Felix已经提到了必要的工具:前向声明和包括警卫.我还可以通过@ kotlinski对Larman书籍的推荐来更深入地理解这个主题.
学习好的设计需要练习,所以不要放弃,如果你的第一种方法看起来并不完美:-)在C++中,一个特别的痛苦是更改后重新编译过大.为了最大限度地减少这种情况,请努力确保您最依赖的事物(类,标题)是最不频繁更改的事物.即依赖于接口(抽象类),而不是具体实现.
此外,努力保持逻辑分区(类/组件)和物理分区(页眉/ cpp文件)之间的健康的关系.典型的方法是将每个类定义放入一个单独的头文件中,并将其实现(如果适用)放到单独的cpp文件中.但是,您可能更喜欢在单个标头中定义紧密耦合的类(组件),以强调它们的逻辑关系.
一般而言,具有两个相互依赖的模块是设计气味.你也可以
1)将模块合并为一个新的C,或
2)将一个公共子集提取到I中,使A和B依赖于I而不是彼此.
更新
使用前向声明和#pragma一次或#include/#ifndef保护: