是否存在这样一种依赖模式,以至于不可能将所有内容都保存在头文件中?如果我们只强制每个标题一个类的规则怎么办?
出于这个问题的目的,让我们忽略静态的东西:)
我知道标准 C++ 中没有任何特性,除了你已经提到的静态特性,它需要一个库来定义一个完整的翻译单元(而不仅仅是标题)。但是,不建议这样做,因为这样做会强制所有客户端在库更改时重新编译他们的整个代码库。如果您使用源文件或静态库或动态库形式的分发,则可以更改/更新/修改您的库,而无需强制所有人重新编译。
我想说,在不使用许多语言功能的明确条件下,这是可能的:正如您所注意到的,static
关键字的一些用途。
这可能需要一些技巧,但可以对其进行审查。
()
)。请注意,在 C++0x 中,这成为首选方式,因为它保证是线程安全的,同时仍能防止初始化顺序失败,直到那时……它不是线程安全的;)尊重这 3 点,我相信您将能够编写一个成熟的仅包含标头的库(有人看到我错过的其他内容吗?)
许多 Boost 库使用了类似的技巧来仅作为标头,即使它们的代码不是完全模板。例如Asio
,非常有意识地提出了使用标志的替代方案(请参阅Asio 1.4.6 的发行说明):
这样(以图书馆开发人员付出更多努力为代价)客户得到他们的蛋糕并吃掉它。我认为这是一个非常好的解决方案。
注意:我想知道static
函数是否可以内联,我更喜欢自己使用匿名命名空间,所以从来没有真正研究过它......
The one class per header rule is meaningless. If this doesn't work:
#include <header1>
#include <header2>
then some variation of this will:
#include <header1a>
#include <header2>
#include <header1b>
This might result in less than one class per header, but you can always use (void*) and casts and inline functions (in which case the 'inline' will likely be duly ignored by the compiler). So the question, seems to me, can be reduced to:
class A
{
// ...
void *pimpl;
}
Is it possible that the private implementation, pimpl, depends on the declaration of A? If so then pimpl.cpp (as a header) must both precede and follow A.h. But Since you can always, once again, use (void*) and casts and inline functions in preceding headers, it can be done.
Of course, I could be wrong. In either case: Ick.
在我漫长的职业生涯中,我还没有遇到过不允许仅使用标头实现的依赖模式。
请注意,如果类之间存在循环依赖关系,您可能需要求助于抽象接口 - 具体实现范例,或使用模板(使用模板允许您前向引用模板参数的属性/方法,这些属性/方法稍后在实例化期间解决)。
这并不意味着您应该始终以仅标头库为目标。尽管它们很好,但它们应该保留给模板和内联代码。它们不应该包括大量复杂的计算。