【问题标题】:What is advantage of defining class inside namespace in c++?在 C++ 中的命名空间内定义类有什么好处?
【发布时间】:2015-05-16 20:59:23
【问题描述】:

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

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

x.h 如下所示:

 class x{
 private:
  struct abc;
  };

而 x.cpp 看起来像:

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

【问题讨论】:

标签: c++ namespaces


【解决方案1】:

匿名命名空间只能在其编译单元内访问。这意味着没有其他 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 的唯一访问是通过继承自abcx

这使它与私有成员甚至私有继承真正不同。由于在其他编译单元中不能绝对不引用abc,所以只能使用x 的前向声明。因此 x 注定要在 x.cpp 之外保持不完整的类型。

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

【讨论】:

  • 好的,第一部分很清楚,x不是abc继承的,它的语法如下:struct x::abc{};那么,这样做有什么好处呢?
  • @golukashyap 这样你就可以将一个 1000 行的怪物函数重构为 200 个静态函数和 200 个私有类,而不会引起任何人的注意。
  • :: 方法不同,但理念相同。如果您在标头中声明了私有结构,则标头的用户只能将其用作不完整的类型(即通过指针),但看不到内容。在您的 x.cpp 中声明 x::abc { };使用范围解析运算符定义x 中的abc。 (类似于成员函数的语法)。
猜你喜欢
  • 2011-07-20
  • 1970-01-01
  • 1970-01-01
  • 2011-01-20
  • 2016-12-28
  • 2011-11-09
  • 2018-03-06
  • 2014-10-18
相关资源
最近更新 更多