首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >嵌套类C++中的可访问性和可见性

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

Stack Overflow用户
提问于 2016-01-18 03:26:37
回答 1查看 886关注 0票数 3

我在主函数所在的文件中编写了以下代码片段。但是,Visual中的特性指出,“非静态成员引用必须相对于特定对象”。在我看来,函数m中的x应该是文件范围中定义的int x,并且它应该可以在这个文件的任何地方访问。

请指出我误解了什么地方。提前谢谢你!

代码语言:javascript
复制
int x = 0;
class Test1{
protected:
    char *x;
    class Test2{
    public:
        int m(){
            return x++;
        }
    };
};
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-18 03:42:20

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

当您在示例中引用Test1::Test2::m()中的Test1::Test2::m()时,编译器将在作用域链上找到第一个xTest1::x。因为这不是一个静态成员变量,所以您将得到错误。

如果要引用全局x,请使用::x。我修改了您的示例,以演示:

代码语言:javascript
复制
#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;
}

这些指纹:

代码语言:javascript
复制
x = 0
x = 1

关于样式的$.02注意事项:如果您将嵌套类保留给只对自己操作的简单数据容器,这是一种常见的最佳实践,您将不会遇到这个问题。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34846827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档