嵌套 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 时,编译器将沿着作用域链向上查找第一个 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 关于样式的注意事项:如果您将嵌套的 classes 保留给仅在其自身上运行的简单数据容器,这是一种常见的最佳做法,您将不会 运行问题。