class A
{
A a;//why can't we do this
};
7
A
回答
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!
};
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++編程語言」 中給出。
它的工作原理... 一些解釋會很好。
相關問題
- 1. 爲什麼我不能在類中聲明一個字符串?
- 2. 爲什麼在相同的頭文件中聲明一個類爲類聲明
- 3. 爲什麼我們不能在C++中的同一個類中聲明一個類的對象,但是它允許在Java中使用?
- 4. 在類聲明中聲明一個類對象的指針
- 5. 爲什麼我不能多聲明一個類
- 6. 對象作爲參數,爲什麼不能我們聲明的類,而不是
- 7. 在其類中聲明一個對象
- 8. 聲明一個對象作爲一個特定的類在PHP
- 9. 爲什麼不能JLabel的是一個內部類聲明
- 10. 爲什麼我不能在保護類型的同一個包中聲明一個共享變量?
- 11. 爲什麼我在一個聲明中獲得多種類型?
- 12. 在類擴展中聲明一個ivar有什麼不對?
- 13. 爲什麼我不能在類定義中實例化同一類的對象
- 14. 聲明一個類的對象到另一個類
- 15. 爲什麼要在Java中聲明一個不可變類final?
- 16. 爲什麼我們不能在const中聲明一個映射並填充它?
- 17. 爲什麼我們要在普通類中聲明靜態類?
- 18. 如何獲得在另一個類中聲明的類對象?
- 19. 在php中聲明一個抽象類
- 20. 聲明一個不同的通用類
- 21. 不能在同一個類中使用聲明的字典嗎?
- 22. 爲什麼我不能聲明一個參數化的靜態類變量?
- 23. 不能在同一個類中的函數中使用變量聲明的類。爲什麼?
- 24. C++什麼放在一個類聲明,什麼不是
- 25. 爲什麼我不能將一個實例變量聲明爲PHP中的一個對象數組?
- 26. 爲什麼我們需要在類內聲明一個接口?我們這樣做有什麼優勢嗎?
- 27. 爲什麼我們不能聲明任何* Params Annotaion在類(RCC)級別,同時在Jax-RS中聲明@Singleton
- 28. 爲什麼Flex讓我把一個類當作一個對象
- 29. 聲明一個抽象類類型
- 30. 聲明一個對象的類型尚未聲明
當這樣的類被實例化時會發生什麼?它會構造一個A,構造另一個A,等等,直到時間結束。所以,是的,一個堆棧溢出的構造函數並不是一件好事。哦,是的,這個實例的大小是無限的。 – 2011-02-09 05:32:08
這是一直在下降的海龜。 – jason 2011-02-09 05:33:24