ネストした型

提供: RAD Studio
移動先: 案内検索

メンバのスコープ:インデックス への移動

クラス内で宣言されたタグ名または 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'

関連項目