5

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

//myheader.h

namespace stuff
{
  int repair(firstObj obj);
  int doSomethingElse();
  privateObj obj;
}

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

是否有一些关键字可以用来限制访问?

4

4 回答 4

12

使用未命名的命名空间:

namespace stuff
{

  int repair(firstObj obj);

  namespace 
  {
    int doSomethingElse();
    privateObj obj;
  }

}

这里[强调我的]:

未命名的命名空间是变量静态声明的更好替代品。 它们允许变量和函数在整个翻译单元内可见,但在外部不可见。尽管未命名命名空间中的实体可能具有外部链接,但它们有效地由其翻译单元唯一的名称限定,因此永远无法从任何其他翻译单元看到。

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


编辑:刚刚注意到这是我们正在谈论的头文件:

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

那么你不应该首先在公共头文件中声明这些方法和对象,而是在特定的实现文件中:如果其他人不应该使用它们,其他人甚至不应该知道它们存在。

然后使用一个未命名的命名空间来有效地限制可达性(例如如果有人会不小心使用相同的标识符提供另一个声明)。

如果将它留在头文件中,可能会发生这种情况:匿名名称空间和一个定义规则(如果头文件包含在多个翻译单元中):

于 2012-08-02T17:54:18.247 回答
5

是的,把它放在一个匿名命名空间中:

namespace stuff
{
    int repair(firstObj obj)

    namespace
    {
        int doSomethingElse();
        privateObj obj;
    }
}
于 2012-08-02T17:54:36.493 回答
2

声明它们,因为static 这意味着它们只能在该文件中访问。

于 2012-08-02T17:54:57.457 回答
0

您可以使用关键字static

namespace stuff
{
 int repair(firstObj obj)
 static int doSomethingElse();
 static privateObj obj;
}

因此,对象和函数只能在当前文件中访问。

于 2012-08-02T17:55:52.727 回答