嵌套类C++中的可访问性和可见性
Accessibility and Visibility in Nested Class C++
我在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 关于样式的说明:如果为仅对自身操作的简单数据容器保留嵌套类(这是常见的最佳实践),则不会遇到此问题。
相关文章:
- 如何更改唯一指针向量的可见性
- 当指向对象的指针作为参数传递给 std::thread 时,内存可见性
- 限制静态库中符号的可见性 (MSVC/Visual C++)
- 班级成员可见性C++
- 内联模板函数的可见性
- Clang 是否可以在使用可见性属性时生成导入库(不带 __declspec(dllexport))?
- std::mutex 的发布-获取可见性保证是否仅适用于关键部分?
- 符号可见性和 gcc 警告
- C++/libscreen 无法更新可见性
- 在 C++11 线程中,std::mutex 对内存可见性有什么保证?
- C++继承构造函数的可见性
- CRTP - 嵌套叶类类型的可见性
- C++模板 - 实例之间的通用操作和成员可见性
- 放松的订单和线程间可见性
- GCC 6.x警告有关Lambda可见性
- C++ 中的Shared_ptr和内存可见性
- 静态库中的符号可见性和操作
- 在C++中声明可见性/访问权限的方法有何不同
- 嵌套类C++中的可访问性和可见性
- 在C++中,do访问说明符不控制静态成员的可见性