为什么内部类*定义*不能使用其父类?

Why can't inner class *definitions* use their parent?

本文关键字:父类 不能 内部类 定义 为什么      更新时间:2023-10-16

众所周知,您定义的类型不能具有成员

class Foo {
    Foo member;
};

原因是这是一个无限递归的无限大物体。但是,我们 can 具有 static 成员:

class Foo {
    static Foo member;
};

我们可以这样做,因为Foo的表现就像一个名称空间。Foo的实例不包含.member,因此没有无限参考。换句话说,.member属于类,而不是实例。我想做的非常相似:

class Foo {
    class Bar {
        Foo member;
    };
};

再次,Foo的表现像名称空间。Foo的实例实际上是空的。我必须制作一个非静态字段Bar Foo::bar;才能开始遇到布局问题。不幸的是,我的编译器不同意(例如GCC):

<source>:3:14: error: field 'member' has incomplete type 'Foo'
Foo member;
^~~~~~

由于哪个技术原因不允许?

长话短说,不允许这样做比允许更容易。

这是一个示例,它显示了可能很困难的示例:C 让您将嵌套的类定义与成员声明结合在一起,例如:

class Foo {
    class Bar {
        Foo member;
    } bar; // <<== Here
};

很明显,为什么必须不允许此定义:与可能还可以的类定义不同,成员定义使大小计算不可能。

当然,标准的作者可以允许班级定义通过,以牺牲编译器作者的额外工作为代价。但是,看来他们决定允许此功能不值得麻烦,因此他们并没有在宣布实例时完成课程的要求。

您的工作没有错,您可以使用不同的语法进行操作。

由于编译器要确定类栏的大小,因此需要知道类FOO的大小,但是FOO的定义尚未完成(源代码尚未完全由编译器解析)。在使用bar之前,必须完成FOO的定义。

相反

class Foo {
    class Bar;
};
class Foo::Bar {
  Foo member;
};

不允许使用,因为您无法使用具有不完整类型的成员定义类。在班级定义的结尾,班级变得完整,只有知道其所有成员的大小才有可能。

例如,出于相同的原因,您会遇到相同的错误,而没有这样的嵌套类:

class Foo;
class Bar {
    Foo member;
};

当然,在您的示例中,语言可以推迟完成Foo::Bar的定义,直到定义Foo为止,但这与一般类别定义的方式不一致。您将在源代码完全定义后的某个点中具有Foo::Bar的怪异行为。