2011-07-14 168 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

實際上,Im在遠程位置,而我在此m/c中沒有編譯器:( – user844631

回答

4

不,它是不合法的
class B本地類methodA()

class B無法訪問封閉函數的非靜態「自動」局部變量。但它可以從封閉範圍訪問靜態變量。

有什麼本地類可以訪問的限制。

下面是從C++標準的參考:

9.8本地類聲明[class.local]

  1. 一個類可以一個函數定義中所定義;這樣的班級被稱爲本地班級。本地類的名​​稱是其封閉範圍的本地名稱。本地類位於封閉範圍的範圍內,並且與封閉函數具有相同的對函數外名稱的訪問。本地類中的聲明只能使用類型名稱,靜態變量,外部變量和函數以及封閉範圍中的枚舉器。

[實施例:

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

嗯,好的將編輯我的答案,並替換嵌套與本地。我有一種直覺它不會改變答案雖然;-) – Perception