2011-02-09 91 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++編程語言」 中給出。

它的工作原理... 一些解釋會很好。

相關問題