为什么不允许在同一个类中定义类对象?

时间:2014-03-13 03:13:40

标签: c++ class

这是我的代码:

class Link;
class LinkScreen;
class LinkScreen {
    Link* linkScreen1;
    LinkScreen linkScreen2; 
};

class Link {}; 

make错误:

test.cpp:6:16: error: field ‘linkScreen2’ has incomplete type

为什么不允许这样做?

4 个答案:

答案 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对象.....它永远不会结束。


关于让另一个班级成为会员的更多信息。

与指向另一个类的指针/引用不同,如果要将另一个类包含为成员,则仅使用前向声明是不够的。编译器需要知道实际的"布局"你的会员,所以它可以决定"记忆的布局"那个班。因此,您需要完整声明"包含的类"课前可用。这意味着,你的班级永远不可能拥有"包含"一个相同类型的成员。