如何限制访问某些功能或对象到当前文件?

use*_*248 4 c++ scope privacy namespaces public

我想知道是否可以将对命名空间中声明的某些函数或对象的访问权限仅限于同一文件中的其他类.例如,

//myheader.h

namespace stuff
{
  int repair(firstObj obj);
  int doSomethingElse();
  privateObj obj;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我希望只有在此文件中声明的类才能访问该函数doSomethingElse()和对象obj.

我可以使用一些关键字来限制访问吗?

moo*_*eep 12

使用未命名的命名空间:

namespace stuff
{

  int repair(firstObj obj);

  namespace 
  {
    int doSomethingElse();
    privateObj obj;
  }

}
Run Code Online (Sandbox Code Playgroud)

这里 [强调我的]:

未命名的命名空间是静态变量声明的优越替代品. 它们允许变量和函数在整个翻译单元中可见,但在外部不可见.虽然未命名的命名空间中的实体可能具有外部链接,但它们实际上由其翻译单元唯一的名称限定,因此永远不会从任何其他翻译单元中看到.

另请参阅此相关问题:未命名/匿名命名空间与静态函数


编辑:刚才注意到它是我们正在讨论的头文件:

在这种情况下,我希望函数doSomethingElse()和对象obj只能被此文件中声明的类访问.

那么你不应该声明这些方法和对象在第一个地方一个公共的头文件,而是在具体实施文件:如果其他不得使用它们,其他应该甚至不知道他们会存在.

使用具名命名空间,以有效地限制了可访问性(例如,如果有人不小心提供使用相同标识的另一声明).

如果将其保留在头文件中,可能会发生这种情况:匿名命名空间和一个定义规则(如果头部包含在多个转换单元中):


Mar*_*k B 5

是的,将它放在匿名命名空间中:

namespace stuff
{
    int repair(firstObj obj)

    namespace
    {
        int doSomethingElse();
        privateObj obj;
    }
}
Run Code Online (Sandbox Code Playgroud)