2016-01-18 51 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'属于封闭类名称空间?谢谢! –