Jos*_*ley 29 c++ forward-declaration
众所周知,使用前向声明比在头文件中使用#includes更好,但是管理前向声明的最佳方法是什么?
有一段时间,我手动向每个头文件添加该头文件所需的前向声明.但是,我最终得到了一堆头文件重复相同的六个左右的前向声明,这似乎是多余的,并且维护这些重复的列表变得有点单调乏味.
typedef的前向声明(例如struct SensorRecordId; typedef std::vector<SensorRecordId> SensorRecordIdList;)在多个头文件中复制也有点多.
因此,我创建了一个ProjectForwards.h包含所有前向声明的文件,并将其包含在需要的任何地方.起初,这似乎是个好主意 - 更不用说冗余了,而且更容易维护typedef.但是现在,由于大量使用ProjectForwards.h,每当我添加一个新类时,我都必须重建世界,这会减慢开发速度.
那么管理前向声明的最佳方法是什么?我应该咬紧牙关并在多个子系统中重复单独的前向声明吗?继续这种ProjectForwards.h方法?尝试拆分ProjectForwards.h成几个SubsystemForwards.h文件?我忽视了一些其他解决方案?
听起来这些类在您的项目中很常见.您可以尝试其中一些:
做最好的自己掰开ProjectForwards.h分成几个文件,如你所说.确保每个子系统只获得它真正需要的声明.如果不出意外,该过程将迫使您考虑子系统之间的耦合,您可能会找到减少它的方法.这些都是避免过度编译的好方法.
模仿<iosfwd>.让每个公共类或模块提供自己的forward-include头,它只提供类名和任何便利typedef.然后你可以#include到处都是.是的,你会重复列表中的很多,但想想这样说:没有人抱怨#包括<vector>,<string>和<map>在他们的代码在六个不同的地方.
更频繁地使用Pimpl.这将与我之前的建议产生类似的效果,但需要您做更多的工作.如果你的接口是稳定的,那么你可以安全地在这些头文件中提供typedef并直接#include它们.
一般来说:
为您的模块用户提供转发文件.这只会声明那些作为API的一部分出现的类.
如果您在实现中使用了常用转发器,则可以使用基于实现的转发文件.
对于您使用的每个类,您可能不需要前向声明.