我有一个x.cpp文件,其中我看到在命名空间内定义了一个类。所以,我的问题是:
1)在命名空间内定义类有什么好处? 2)其次,我还看到在同一个x.cpp文件中从命名空间定义的结构。那么,在同一个x.cpp文件中这样做有什么好处呢?
x.h看起来如下:
class x{
private:
struct abc;
};
x.cpp看起来像:
namespace{
class{};
}
struct x:abc{};
答案 0 :(得分:4)
匿名命名空间只能在其编译单元中访问。这意味着没有其他cpp可以访问x.cpp
的匿名命名空间中的任何内容。
namespace {
class abc {}; // this class is visible only within x.cpp
// no other separately compiled cpp can't see it.
}
struct x : abc{}; // the struct (class) x inherits from abc.
优点是它使实现真正私密。对abc
的唯一访问权限来自x
,其继承自abc
。
这使得它与私有成员甚至私有继承真正不同。由于您不能绝对不在其他编译单元中引用abc
,因此您只能使用x
的前向声明。因此,x注定要在x.cpp
之外保持不完整的类型。
事实上,这种方法是实现完美PIMPL的第一步。这个interesting article演示了使用匿名命名空间实现PIMPL习语的完整示例。