2011-07-14 12 views
3

他のクラス(内部クラス)のメソッドで記述されたクラスは、メソッド変数にアクセスできますか?私は以下のコードで意味します:内部クラスへのアクセス

class A 
{ 
    void methodA(int a) 
    { 
    class B 
    { 
     void processA() 
     { 
     a++; 
     } 
    }; 
    std::cout<<"Does this program compile?"; 
    std::cout<<"Does the value of the variable 'a' increments?"; 
    }; 

}

これは正当なものですか?「a」の値は増分されますか?どうか提案してください。

ありがとう、 Pavan。

+2

よくお試しになりませんか? –

+0

http://www.comeaucomputing.com/tryitout/ "9行目:エラー:内包する関数のローカル変数への参照が許可されていません" –

+0

実際、遠隔地にいる私はこのm/cにコンパイラを持っていません: – user844631

答えて

4

はありません、
class BmethodA()ローカルクラスで法的ではありません。

class Bは、囲み関数の非静的な「自動」ローカル変数にアクセスできません。しかし、それは囲みスコープから静的変数にアクセスすることができます。

ローカルクラスがアクセスできるものにはいくつかの制限があります。ここ

は、C++標準からの参照である:

9.8ローカルクラス宣言は[class.local]

  1. クラスは、関数定義内で定義することができます。そのようなクラスはローカルクラスと呼ばれます。ローカルクラスの名前は、その囲みスコープに対してローカルです。ローカルクラスは囲みスコープのスコープ内にあり、囲み関数と同じように関数外の名前へのアクセスも同じです。ローカルクラスの宣言では、型名、静的変数、extern変数と関数、および囲みスコープの列挙子のみを使用できます。

[例:

int x; 
void f() 
{ 
    static int s ; 
    int x; 
    extern int g(); 

    struct local { 
     int g() { return x; } // error: x is auto 
     int h() { return s; } // OK 
     int k() { return ::x; } // OK 
     int l() { return g(); } // OK 
    }; 
// ... 
} 
local* p = 0; // error: local not in scope 

末端例]

2囲み機能は、ローカル・クラスのメンバーへの特別なアクセス権を持っていません。通常のアクセス規則に従います(第11節)。ローカルクラスのメンバ関数は、それらがまったく定義されていれば、クラス定義内に定義されなければならない。

3.クラスXがローカルクラスである場合、ネストされたクラスYはクラスXで宣言され、後でクラスXの定義で定義されるか、後でクラスXの定義と同じスコープで定義されます。ローカルクラス内にネストされたクラスはローカルクラスです。

4.ローカルクラスには静的データメンバーが含まれていてはなりません。

1

短い回答、いいえ。 C++のローカルクラスは、(いくつかの注意点を含む)それらの関数変数を囲むことにアクセスすることはできません。 C++のローカルクラスhereについて詳しくは、nice SO answerを参照してください。強調のため:

ローカルクラスは、関数定義内で宣言されています。ローカルクラスの宣言では、型名、列挙体、囲みスコープの静的変数、および外部変数や関数しか使用できません。

int x;       // global variable 
void f()      // function definition 
{ 
     static int y;   // static variable y can be used by 
           // local class 
     int x;     // auto variable x cannot be used by 
           // local class 
     extern int g();   // extern function g can be used by 
           // local class 

     class local    // local class 
     { 
      int g() { return x; }  // error, local variable x 
             // cannot be used by g 
      int h() { return y; }  // valid,static variable y 
      int k() { return ::x; } // valid, global x 
      int l() { return g(); } // valid, extern function g 
     }; 
} 

int main() 
{ 
     local* z;    // error: the class local is not visible 
// ...} 
+0

Hmmm、okは私の答えを編集し、ローカルにネストされたものに置き換えられます。しかし、それは答えを変えることはありません;-) – Perception

関連する問題