class A
{
A a;//why can't we do this
};
class A
{
A a;//why can't we do this
};
因为类会无限增大。
(这是通过语言指定的,指定不能将不完整的类型作为成员,只能将引用或指针作为成员,而且在类定义结束之前,A
是一个不完整的类型。)
class A {
A* a;
}
因为它不需要知道 A 的大小。
我猜你可能是从Java或其他语言过来的?A a
会创建一个完整的A
类型实例,这个实例中包含了A
,而这个A
又包含了A
,接着又包含了A
。
你可能正在思考这个:
class A
{
A *a; // A pointer to A, not a full instance
};
*a
的大小? - ajaysinghnegiA a;//why can't we do this
A
是一个不完整的类型,因为它还没有被定义,而是在被定义。当编译器在class A
中看到A
时,需要知道A
的完整类型,而由于A
是不完整的,它无法确定其大小,也无法确定成员变量a
将占用多少空间,因此编译器无法编译它。class A
{
A *pA; //okay since sizeof(pA) == sizeof(void*) == well-known to the compiler!
};
Online Demo : http://www.ideone.com/oS5Ir
class A {
A* a;
};
class A
{
A* aObj; // Self Referential Pointer
}