嵌套类C++中的可访问性和可见性

Accessibility and Visibility in Nested Class C++

本文关键字:访问 可见性 C++ 嵌套      更新时间:2023-10-16

我在main函数所在的同一文件中编写了以下代码片段。但是,Visual Studio 中的实时语义错误功能指出"非静态成员引用必须相对于特定对象"。在我看来,函数 m 中的 x 应该是文件范围内定义的 int x,并且应该可以在该文件的任何地方访问。

请指出我误解的地方。提前谢谢你!

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

您在此处创建的是一个嵌套类:嵌套类的名称存在于封闭类的作用域中,并且从嵌套类的成员函数中查找的名称在检查嵌套类的作用域后访问封闭类的作用域。

当您在示例中引用Test1::Test2::m()内的x时,编译器将沿着作用域链向上并找到要Test1::x的第一个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 = %dn", x);
    Test1::Test2 foo;
    foo.m();
    printf("x = %dn", x);
    return 0;
}

这将打印:

x = 0
x = 1

$.02 关于样式的说明:如果为仅对自身操作的简单数据容器保留嵌套类(这是常见的最佳实践),则不会遇到此问题。