ネストした型
メンバのスコープ:インデックス への移動
クラス内で宣言されたタグ名または typedef 名は、字句的にはそのクラスのスコープに属します。該当するクラスのスコープ内にある場合を除き、このような名前には、一般に xxx::yyy という表記でのみアクセスできます。
別のクラス内で宣言されたクラスを "ネストしたクラス" と呼びます。ネストしたクラスの名前は、そのクラスを含んでいるクラスに対してローカルです。つまり、ネストしたクラスは、そのクラスを含んでいるクラスのスコープ内にあります。これはあくまで字句的なネストです。ネストしたクラスは、そのクラスを含んでいるクラスのメンバに対する優先的なアクセス権を持っているわけではなく、その逆もまた同様です。
クラスは、このようにして、メモリの許す限り、任意のレベルまでネストできます。ネストしたクラスをあるクラス内で宣言し、後で定義することができます。次に例を示します。
struct outer { typedef int t; // 'outer::t' is a typedef name struct inner // 'outer::inner' is a class { static int x; }; static int x; int f(); class deep; // nested declaration }; int outer::x; // define static data member int outer::f() { t x; // 't' visible directly here return x; } int outer::inner::x; // define static data member outer::t x; // have to use 'outer::t' here class outer::deep { }; // define the nested class here
C++Builder では、クラス内で宣言されたタグ名または typedef 名は、実際にはグローバル(ファイル)スコープに属します。次に例を示します。
struct foo { enum bar { x }; // 2.0 rules: 'bar' belongs to file scope // 2.1 rules: 'bar' belongs to 'foo' scope }; bar x;
このコード断片は、コンパイルしてもエラーにはなりません。しかし、C++ 2.1 の規則に違反しているため、次のような警告が出力されます。
Warning: Use qualified name to access nested type 'foo::bar'