5
void foobar(){
    int local;
    static int value;
     class access{
           void foo(){
                local = 5; /* <-- Error here */
                value = 10;
           }
     }bar;    
}   
void main(){
  foobar();
}

local内部foo()コンパイルにアクセスしないのはなぜですか? OTOH 静的変数に簡単にアクセスして変更できますvalue

4

4 に答える 4

1

ローカル クラス内では、外側のスコープから auto 変数を使用/アクセスすることはできません。外側のスコープからの静的変数、extern 変数、型、列挙型、および関数のみを使用できます。

于 2010-10-14T05:03:47.500 に答える
1

標準ドキュメントSec 9.8.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
};
// ...
}

したがって、ローカル クラス内の auto 変数にアクセスすることはできません。ローカル値staticまたはグローバル値のどちらか、設計に適した方を作成します。

于 2010-10-14T05:07:51.890 に答える
0

静的localにすると、アクセスできるはずです

于 2010-10-14T05:04:52.413 に答える
0

おそらく、関数のスコープ外にあるオブジェクトを宣言できるためです。

foobar() called // local variable created;
Access* a = new Access(); // save to external variable through interface
foobar() finished // local variable destroyed

...


savedA->foo(); // what local variable should it modify?
于 2010-10-14T05:11:04.887 に答える