ネスト・クラス は、別のクラスのスコープ内で宣言されるものです。
ネスト・クラスの名前は、その囲みクラスに対してローカルです。
ポインター、参照、またはオブジェクト名を明示的に使用しない限り、
ネスト・クラスでの宣言で使用できるのは可視構成だけで、
これには、囲みクラスからの型名、静的メンバー、および列挙子と、グローバル変数が含まれます。
ネスト・クラスのメンバー関数は、正規のアクセス規則に従い、囲みクラスのメンバーへの 特別なアクセス権を持ちません。囲みクラスのメンバー関数は、ネスト・クラスのメンバーへ の特別なアクセスは行いません。次の例は、このことを示しています。
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 を許可しません。
ネーム・スペース・スコープで、ネスト・クラスのメンバー関数および静的データ・メンバーを定義することができます。 例えば、以下のコード・フラグメントでは、修飾された型名を使用して、静的メンバー x と y、およびネスト・クラス 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::C は A::B から継承します。 コンパイラーは、A::B も A::C も private なので、 宣言 A::B y2 および A::C *x2 を許可しません。
関連参照