2016-01-18 94 views
3

我在主函數所在的同一文件中編寫了以下代碼片段。但是,Visual Studio中的實時語義錯誤功能說'非靜態成員引用必須與特定對象有關'。在我看來,函數m中的x應該是文件範圍中定義的int x,並且應該可以在該文件的任何位置訪問。嵌套類C++中的可訪問性和可見性

請指出我誤解的地方。先謝謝你!

int x = 0; 
class Test1{ 
protected: 
    char *x; 
    class Test2{ 
    public: 
     int m(){ 
      return x++; 
     } 
    }; 
}; 
+0

對不起。我錯過了我的代碼的第一行。現在正確。 –

回答

2

什麼您在此處創建一個nested class嵌套類的名稱在封閉類的嵌套類的成員函數的範圍,名稱查找存在訪問封閉範圍在檢查嵌套類的範圍之後,

當你在你的例子是指xTest1::Test2::m(),編譯器會漲作用域鏈,並找到第一xTest1::x。因爲這不是一個靜態成員變量,你會得到錯誤。

如果您想參考全球x請使用::x。我修改你的例子來說明:

#include <stdio.h> 

int x = 0; 
class Test1{ 
public: 
    char *x; 
    class Test2{ 
    public: 
     int m(){ 
      return ::x++; 
     } 
    }; 
}; 

int main() { 
    printf("x = %d\n", x); 
    Test1::Test2 foo; 
    foo.m(); 
    printf("x = %d\n", x); 
    return 0; 
} 

此打印:在風格

x = 0 
x = 1 

$ .02注:如果您保留嵌套類簡單的數據容器,只有對自己操作,因爲是一種常見的最佳做法,你不會遇到這個問題。

+0

在給出的鏈接中,它說:「作爲其封閉類的任何成員,嵌套類可以訪問封閉類可以訪問的所有名稱(私有,受保護等),但它是獨立的,並且沒有特殊的訪問權封閉類的這個指針「。 _Q1._這是否意味着嵌套類'N'知道包含類成員'm'(以便確定它是否爲靜態的),但是由於'N'不包含'this'指針,它不能修改'm'? _Q2_如果Q1是肯定的,「N」可以修改靜態成員的原因是因爲它們和'N'屬於封閉類名稱空間?謝謝! –