嵌套 Class C++ 中的可访问性和可见性
Accessibility and Visibility in Nested Class C++
我在 main 函数所在的同一文件中编写了以下代码片段。但是,Visual Studio 中的实时语义错误功能表示 'a nonstatic member reference must be relative to a specific object'。在我看来,函数 m 中的 x 应该是在文件范围内定义的 int x 并且它应该在这个文件的任何地方都可以访问。
请指出我误解的地方。提前致谢!
int x = 0;
class Test1{
protected:
char *x;
class Test2{
public:
int m(){
return x++;
}
};
};
您在这里创建的是一个 nested class:嵌套的 class 的名称存在于封闭 class 的范围内,并且名称查找从嵌套 class 的成员函数在检查嵌套 class.
的范围后访问封闭 class 的范围
当您在示例中的 Test1::Test2::m()
中引用 x
时,编译器将沿着作用域链向上查找第一个 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 关于样式的注意事项:如果您将嵌套的 classes 保留给仅在其自身上运行的简单数据容器,这是一种常见的最佳做法,您将不会 运行问题。
我在 main 函数所在的同一文件中编写了以下代码片段。但是,Visual Studio 中的实时语义错误功能表示 'a nonstatic member reference must be relative to a specific object'。在我看来,函数 m 中的 x 应该是在文件范围内定义的 int x 并且它应该在这个文件的任何地方都可以访问。
请指出我误解的地方。提前致谢!
int x = 0;
class Test1{
protected:
char *x;
class Test2{
public:
int m(){
return x++;
}
};
};
您在这里创建的是一个 nested class:嵌套的 class 的名称存在于封闭 class 的范围内,并且名称查找从嵌套 class 的成员函数在检查嵌套 class.
的范围后访问封闭 class 的范围当您在示例中的 Test1::Test2::m()
中引用 x
时,编译器将沿着作用域链向上查找第一个 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 关于样式的注意事项:如果您将嵌套的 classes 保留给仅在其自身上运行的简单数据容器,这是一种常见的最佳做法,您将不会 运行问题。