2011-02-09 75 views
7
class A 
{ 
    A a;//why can't we do this 
}; 
+1

当这样的类被实例化时会发生什么?它会构造一个A,构造另一个A,等等,直到时间结束。所以,是的,一个堆栈溢出的构造函数并不是一件好事。哦,是的,这个实例的大小是无限的。 – 2011-02-09 05:32:08

+13

这是一直在下降的海龟。 – jason 2011-02-09 05:33:24

回答

15

你可以做

class A { 
    A* a; 
} 

,因为它不需要知道A.

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! 
}; 

在线演示:http://www.ideone.com/oS5Ir

16

因为类的尺寸就达到无穷大。

(这是通过指定你不能有不完全类型作为成员,仅引用或指向它们的指针进行语言明智的,并且A是一个不完整的类型,直到类定义的结尾。)

9

我认为你是从Java或其他东西来的? A a将创建类型为A的完整实例,其中包含A,其中包含A,其中包含A

你可能在想这个问题:

class A 
{ 
    A *a; // A pointer to A, not a full instance 
}; 
1

在C++的大小: 你不能这样做,因为它将是递归结构(没有计算对象大小的结束),要克服这个问题,
使用自我指涉指针,即具有相同类型地址的指针。

class A 
{ 
    A* aObj; // Self Referential Pointer 
} 
1

这是你可以有一个指向A类对象的指针的方式,这样就不需要知道类A在编译时声明之前的大小。

class A { 
A* a; 
}; 
-1
Class Date 
    { 
    int d,m,y; 
    static Date default_date; 
    }; 

这个例子中 “ - 第三版Bjarne的Stroustrup的C++编程语言” 中给出。

它的工作原理... 一些解释会很好。

相关问题