私有嵌套类 c++ 的可视化实例
visual Instance of private nested class c++
>我有以下代码
class A
{
private:
class B
{
public:
void f()
{
printf("Test");
}
};
public:
B g()
{
return B();
}
};
int main()
{
A a;
A::B b; // Compilation error C2248
A::B b1 = a.g(); //Compilation error C2248
auto b2 = a.g(); // OK
a.g(); // OK
b2.f(); // OK. Output is "Test"
}
如您所见,我有 A 类和私有嵌套的 B 类。如果不使用自动,我无法在 A 之外创建 A::B 的实例,但使用 auto 我可以。有人可以解释一下这里有什么问题吗?我使用 VC++ 12.0、13.0、14.0(始终相同的行为(
B
类型只有A
的A
和朋友可以访问,这意味着其他代码不能引用它。另一方面,模板类型推导甚至适用于私有类型,如果你想在A
代码中的任何形式的模板中使用你的私有类型,这是必需的。
auto
功能基于模板类型推断并遵循相同的规则,允许调用auto b2 = a.g();
。
类型演绎!
当您将私有类(A::B
(嵌入到另一个类中时,只有外部类能够创建私有类型的对象A::B
。
以下声明尝试创建您无权访问A::B
的对象:
A::B b; // Compilation error C2248
A::B b1 = a.g(); //Compilation error C2248
这是因为在main()
函数中,您无法"看到"(或访问(埋藏在A
中的私有类。 auto
绕过了这个问题。公共函数A::g()
能够创建A::B
的实例,并将其返回给您。
auto
稍后通过推断类型来解决这个问题。当编译器处理推断auto b2 = a.g();
类型时,会发现该类型A::B
。这没关系,因为A::g()
是A
的成员函数,并且可以访问A::B
。
本质上,只有A
的成员才能声明A::B
,但A::B
可以通过返回A::B
的A
的公共成员来推断。
相关文章:
- 可视化 如何在 c++ 中制作特定大小的文件?
- 可视化C++:发布模式的运行时库作为'Multi-threaded Debug DLL'
- 提升如何在图形可视化中写入边缘的权重?
- 如何在大型c++项目的可视化代码中设置调试
- 可视化编译与 C++ 中的 Extern 变量
- 可视化 Bazel C++预编译标头实现
- 无法为 X.radio 创建中等可视化,因为找不到网络节点可视化 - Omnet++
- C++合并排序可视化工具
- 可视化 使用 VS Code 查找C++应用程序中的内存泄漏
- 可视化 将字符串解析为数组以进行C++
- 可视化 如何在C++中将字符数组转换为 FILE 类型
- 可视化C++载体:未使用的容量
- 可视化 如何在 c++ 中截断
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- OpenCV 中大量可视化::Widget3D 的性能不佳
- GCC、CLANG 和 MSVC 的可视化C++自动矢量化要求
- 如何在可视化代码中生成用于 c++ 开发的调试器?
- 可视化 如何修复 c++ 中已经定义的 -main?
- 可视化将实例传递到另一个类并访问C
- 私有嵌套类 c++ 的可视化实例