C++ 在c++;?

C++ 在c++;?,c++,namespaces,C++,Namespaces,我有一个x.cpp文件,其中我看到一个类在名称空间中定义。所以,我的问题是: 1) 在名称空间内定义类的优点是什么? 2) 其次,在同一个x.cpp文件中,我还看到在名称空间之外定义的结构。那么,在同一个x.cpp文件中这样做有什么好处呢 x、 h的形状如下所示: class x{ private: struct abc; }; 而x.cpp看起来是: namespace{ class{}; } struct x:abc{}; 匿名命名空间只能在其编译单元内访问。

我有一个x.cpp文件,其中我看到一个类在名称空间中定义。所以,我的问题是:

1) 在名称空间内定义类的优点是什么? 2) 其次,在同一个x.cpp文件中,我还看到在名称空间之外定义的结构。那么,在同一个x.cpp文件中这样做有什么好处呢

x、 h的形状如下所示:

 class x{
 private:
  struct abc;
  };
而x.cpp看起来是:

 namespace{
     class{};
 }
 struct x:abc{};

匿名命名空间只能在其编译单元内访问。这意味着没有其他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

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
的正向声明。因此,x注定要在
x.cpp
之外保持一个不完整的类型


事实上,这种方法是实现完美PIMPL的第一步。这演示了一个使用匿名名称空间实现PIMPL习惯用法的完整示例

好的,第一部分很清楚,x不是由abc继承的,它的语法如下:struct x::abc{};那么,这样做的好处是什么呢?@golukashyap,这样你就可以将1000行的monster函数重构为200个静态函数和200个私有类,而不需要任何人注意。使用
这是不同的方法,但原理是一样的。如果在标头中声明了私有结构,则标头的用户只能将其用作不完整类型(即通过指针),但看不到内容。在您的x.cpp中,语句
x::abc{}
;使用范围解析运算符定义
x
中的
abc
。(与成员函数的语法类似)。