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 に、このファイルで宣言されたクラスのみがアクセスできるようにします。

次に、これらのメソッドとオブジェクトをパブリック ヘッダー ファイルで最初に宣言するのではなく、特定の実装ファイルで宣言する必要があります。

次に、名前のない名前空間を使用して、到達可能性を効果的に制限します (たとえば、誰かが誤って同じ識別子を使用して別の宣言を提供した場合)。

ヘッダー ファイルに残しておくと、匿名の名前空間と 1 つの定義規則(ヘッダーが複数の翻訳単位に含まれている場合)が発生する可能性があります。

于 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 に答える