【问题标题】:Namespace-private members in C++C++ 中的命名空间私有成员
【发布时间】:2015-10-22 03:56:14
【问题描述】:

我正在阅读 Scott Meyrse C++,现在我正在阅读关于封装的部分。他说,除非将数据成员声明为私有,否则无法封装数据成员。这很清楚。

但由于我来自 Java 并拥有其 package-private 方法和成员,我感兴趣的是 C++ 是否允许我们做一些技巧来在命名空间中声明一些,以便在外部无法访问命名空间。命名空间私有或类似的东西。我认为使用匿名命名空间的以下代码会很好:

namespace A {
    namespace { //anonymous namespace within the namespace
        int a;
    }
    void foo(){ std::cout << a << std::endl; }
}

int main()
{
    A::a = 2;
    A::foo();
}

但效果很好:http://coliru.stacked-crooked.com/a/b4690b9bb28dad29

【问题讨论】:

  • 一个常见的约定是有一个名为internal 的嵌套命名空间。它仍然可以访问——任何人都可以写A::internal::a——但它清楚地向外部的任何人发出信号,他们将要依赖内部实现细节,这将是危险的。未命名的命名空间做了一些完全不同的事情 - 它包含仅限于此翻译单元(又名源文件)的定义。
  • @IgorTandetnik 确实,听起来很合理。非常感谢您的建议。

标签: java c++ namespaces


【解决方案1】:

我感兴趣的是 C++ 是否允许我们做一些技巧来声明一些 在命名空间中,使其在命名空间之外无法访问。

您不能有一个 private 命名空间,C++ 语言本身将在其中强制执行其隐私,并以与私有成员相同的方式使其无法被外部世界访问。

如果有的话,必须通过在特定代码库中采用一致的命名约定来完成。

这在某种程度上类似于 Python 方法名称以前导下划线 _ 为前缀的约定,以表示该方法(或数据成员)被视为“私有”并且不应从外面。

【讨论】:

    【解决方案2】:

    namespace { //命名空间内的匿名命名空间

    这是未命名的命名空间声明,即它可以用internal linkage 声明,这意味着在未命名命名空间中声明的任何名称都有内部链接。

    所以允许做 A::a = 2

    如果你将该命名空间命名为

    namespace B
    

    那么你必须这样做:

    A::B::a = 2;
    

    【讨论】:

      猜你喜欢
      • 2012-05-27
      • 1970-01-01
      • 2014-04-29
      • 2021-01-02
      • 1970-01-01
      • 2014-02-19
      • 2017-10-03
      • 2011-10-12
      • 2017-09-04
      相关资源
      最近更新 更多