我正在开发一个相当大的 C++ 支持库,并且发现自己正在转向仅使用标头的方法。在 C++ 中,这几乎可以工作,因为您可以实现在类中定义的位置。对于模板化方法,无论如何,实现都必须在同一个文件中,所以我发现将实现与定义保持在一起要容易得多。
但是,有时必须使用“来源”。仅举一个例子,有时会出现循环依赖,并且必须在类定义之外编写实现。以下是我的处理方式:
//part of libfoo.h
class Bar
{
void CircularDependency(void);
};
#ifdef LIBFOO_COMPILE_INLINE
void Bar::CircularDependency(void)
{
//...
}
#endif
然后使用 libfoo 的项目将在 main.cpp 中执行以下操作:
//main.cpp
#define LIBFOO_COMPILE_INLINE
#include "libfoo.h"
在任何其他 .cpp 中:
//other.cpp
#include "libfoo.h"
关键是 compile-inline 部分只编译一次(在 main.cpp 中)。
最后我的问题是:这个成语或任何其他以这种方式工作的项目是否有名称?这似乎是模板和类方法模糊了实现和定义的自然结果。并且:是否有任何理由说明这是一个坏主意,或者为什么它可能无法很好地扩展?
顺便说一句:我知道许多编码人员有充分的理由更喜欢他们的标题类似于接口而不是实现,但是恕我直言文档生成器更适合描述接口,因为我喜欢将私有成员隐藏在一起:-)