为什么内部类*定义*不能使用其父类?
Why can't inner class *definitions* use their parent?
众所周知,您定义的类型不能具有成员:
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
的怪异行为。
- 如何使父类不重复已经执行的祖父方法
- 为什么转发声明的好友类不能在类中引用?
- 派生类不能用另一个基类的成员重载基类中的私有成员
- 一类嵌套类不能用作模板函数类型名
- 为什么这个模板类不能正常工作?
- GNU C++:为什么自定义类不能是unordered_map的值类型
- 具有非静态 lambda 成员的类不能使用默认模板参数?
- 为什么嵌套类不能有一个类型为封闭类的成员?
- 具有显式析构函数和 std::unique_ptr<> 成员的类不能在 std::vector<> 中使用?
- c++中的枚举类不能在Mac中编译,而在Windows中工作
- 一个类不能有自己的静态 constexpr 成员实例吗?
- 类不能通过 boost::p ython 包装
- 为什么模板类不能为double正常工作
- 为什么类不能从 decltype 的结果继承?
- Boost矩阵在Objective C类不能编译
- 为什么派生类不能在此代码中调用受保护的成员函数?
- SWIG (v1.3.29)生成的c++到Java Vector类不能正常工作
- c++子类不能从父类继承私有成员
- 好友父类不能访问子类中的私有构造函数
- 派生类不能访问父类方法