我在主函数所在的文件中编写了以下代码片段。但是,Visual中的特性指出,“非静态成员引用必须相对于特定对象”。在我看来,函数m中的x应该是文件范围中定义的int x,并且它应该可以在这个文件的任何地方访问。
请指出我误解了什么地方。提前谢谢你!
int x = 0;
class Test1{
protected:
char *x;
class Test2{
public:
int m(){
return x++;
}
};
};发布于 2016-01-18 03:42:20
您在这里创建的是一个嵌套类:嵌套类的名称存在于封闭类的作用域中,而从嵌套类的成员函数中查找的名称在检查嵌套类的作用域后访问封闭类的作用域。
当您在示例中引用Test1::Test2::m()中的Test1::Test2::m()时,编译器将在作用域链上找到第一个x为Test1::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注意事项:如果您将嵌套类保留给只对自己操作的简单数据容器,这是一种常见的最佳实践,您将不会遇到这个问题。
https://stackoverflow.com/questions/34846827
复制相似问题