这是我的代码:
class Link;
class LinkScreen;
class LinkScreen {
Link* linkScreen1;
LinkScreen linkScreen2;
};
class Link {};
make
错误:
test.cpp:6:16: error: field ‘linkScreen2’ has incomplete type
为什么不允许这样做?
答案 0 :(得分:4)
一个类不能包含它自己的实例,因为这会使实例占用无限量的空间。
考虑一下:你创建了一个LinkScreen
对象...其中包含另一个LinkScreen
对象...其中包含另一个 LinkScreen
对象,其中包含另一个 LinkScreen
对象,等等。
或者,从另一个角度来看,Link*
对象的大小是多少?嗯,它包含的变量大小为:LinkScreen
(通常为4或8个字节)加上Link*
个对象的大小。 那有多大?好吧,它的大小为LinkScreen
加上LinkScreen
的大小。你可以在这里看到无限递归。
您只能创建一个“完整”类型的实例,对于类来说,这意味着编译器已经看到了类定义的结束括号。这会阻止您在类本身中放置一个实例。但是,您可以将指针创建为不完整的类型; LinkScreen*
对象包含{{1}}变量是可以的。
答案 1 :(得分:1)
重复:why can't we declare object of a class inside the same class?
因为它需要知道班级linkScreen
的每个组成成员的大小。在你的情况下,linkScreen2
的大小是未知的,因为该类在那个时刻尚未完全定义。
答案 2 :(得分:0)
您的问题是您的LinkScreen对象包含一个LinkScreen对象,该对象随后包含一个LinkScreen对象,该对象随后包含一个LinkScreen对象等。我想它应该是一个指针。
答案 3 :(得分:0)
因为它只是不合逻辑:
我想你的意思是LinkScreen * linkScreen2;
或LinkScreen& linkScreen2;
如果你真的想要LinkScreen linkScreen2;
,那么想象一下:LinkScreen
对象将包含(不是指)一个LinkScreen
对象,该对象又包含LinkScreen
对象.....它永远不会结束。
关于让另一个班级成为会员的更多信息。
与指向另一个类的指针/引用不同,如果要将另一个类包含为成员,则仅使用前向声明是不够的。编译器需要知道实际的"布局"你的会员,所以它可以决定"记忆的布局"那个班。因此,您需要完整声明"包含的类"课前可用。这意味着,你的班级永远不可能拥有"包含"一个相同类型的成员。