class A
{
A a;//why can't we do this
};
答案 0 :(得分:19)
因为这个类的大小是无限的。
(这是通过指定你不能将不完整的类型作为成员,只能引用或指向它们来完成语言,并且A
在类定义结束之前是不完整的类型。)< / p>
答案 1 :(得分:17)
你可以做到
class A {
A* a;
}
因为它不需要知道A的大小。
答案 2 :(得分:10)
我认为你是来自Java还是什么? A a
会创建一个A
类型的完整实例,其中包含A
,其中包含A
,其中包含A
。
你可能正在考虑这个问题:
class A
{
A *a; // A pointer to A, not a full instance
};
答案 3 :(得分:6)
A a;//why can't we do this
因为A
是一个不完整的类型,因为它尚未定义,而是它被定义。当编译器在A
内看到它时,编译器需要知道class A
的完整类型,并且由于A
不完整,不能确定它的大小,它无法确定成员变量a
将占用多少空间,因此无法编译它。
但是,由于指针的大小对于编译器来说是众所周知的,无论它是什么类型的指针。您可以在类中定义指针,如下所示:
class A
{
A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler!
};
答案 4 :(得分:1)
在C ++中:
你不能这样做,因为它将是递归结构(计算对象大小没有结束),克服这个问题,
使用自引用指针,即具有相同类类型地址的指针。
class A
{
A* aObj; // Self Referential Pointer
}
答案 5 :(得分:1)
这是你可以拥有指向A类对象的指针的方式,这样就不需要在编译时声明类A的大小。
class A {
A* a;
};