私有嵌套类 c++ 的可视化实例

visual Instance of private nested class c++

本文关键字:可视化 实例 c++ 嵌套      更新时间:2023-10-16

>我有以下代码

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类型只有AA和朋友可以访问,这意味着其他代码不能引用它。另一方面,模板类型推导甚至适用于私有类型,如果你想在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::BA的公共成员来推断。