ネスト・クラス

C++ネスト・クラス は、別のクラスのスコープ内で宣言されるものです。 ネスト・クラスの名前は、その囲みクラスに対してローカルです。 ポインター、参照、またはオブジェクト名を明示的に使用しない限り、 ネスト・クラスでの宣言で使用できるのは可視構成だけで、 これには、囲みクラスからの型名、静的メンバー、および列挙子と、グローバル変数が含まれます。

ネスト・クラスのメンバー関数は、正規のアクセス規則に従い、囲みクラスのメンバーへの 特別なアクセス権を持ちません。囲みクラスのメンバー関数は、ネスト・クラスのメンバーへ の特別なアクセスは行いません。次の例は、このことを示しています。

class A {
  int x;
 
  class B { };
 
  class C {
 
    // The compiler cannot allow the following
    // declaration because A::B is private:
    //   B b;
 
    int y;
    void f(A* p, int i) {
 
    // The compiler cannot allow the following
    // statement because A::x is private:
    //   p->x = i;
 
    }
  };
 
  void g(C* p) {
 
    // The compiler cannot allow the following
    // statement because C::y is private:
    //   int z = p->y;
  }
};
 
int main() { }

コンパイラーは、クラス A::B が private なので、オブジェクト b の宣言を許可しません。 コンパイラーは、A::x が private なので、ステートメント p->x = i を許可しません。 コンパイラーは、C::y が private なので、ステートメント int z = p->y を許可しません。

ネーム・スペース・スコープで、ネスト・クラスのメンバー関数および静的データ・メンバーを定義することができます。 例えば、以下のコード・フラグメントでは、修飾された型名を使用して、静的メンバー xy、およびネスト・クラス nested のメンバー関数 f()g() にアクセスすることができます。 修飾された型名を使用すると、typedef を定義して、修飾されたクラス名を表すことができます。 その後、:: (スコープ・レゾリューション) 演算子を用いた typedef を使用して、 ネスト・クラスまたはクラス・メンバーを参照することができます。

class outside
{
public:
      class nested
      {
      public:
            static int x;
            static int y;
            int f();
            int g();
      };
};
int outside::nested::x = 5;
int outside::nested::f() { return 0; };
 
typedef outside::nested outnest;       // define a typedef
int outnest::y = 10;                   // use typedef with ::
int outnest::g() { return 0; };
 

しかし、ネスト・クラス名を示す typedef を使用すると、情報を隠蔽し、理解が困難なコードが作成されます。

詳述型指定子では、typedef 名を使用できません。 例えば、上記の例で次の宣言は、使用できません。

  class outnest obj;

ネスト・クラスは、その囲みクラスの private メンバーから継承します。 次の例は、このことを示しています。

class A {
private:
  class B { };
  B *z;
 
  class C : private B {
  private:
      B y;
//      A::B y2;
      C *x;
//      A::C *x2;
    };
};

ネスト・クラス A::CA::B から継承します。 コンパイラーは、A::BA::C も private なので、 宣言 A::B y2 および A::C *x2 を許可しません。

関連参照

IBM Copyright 2003