我讀了關於C++中的結構,它不能包含它自己的實例。 任何人都可以幫助我理解它爲什麼不能包含它自己的實例嗎?爲什麼結構不能包含它自己的實例?
回答
因爲要創建它的實例,您需要創建變量,它本身就是它的一個實例 - 它將調用構造函數。
這將導致對構造函數的無限遞歸調用。
假設class A
有一個名爲a
的實例變量:
調用的A
構造會造成a
初始化,它本身就是一個A
。要做到這一點 - A
的構造函數將被再次調用。
請注意,它甚至不會編譯,因爲編譯器無法爲它分配內存,它不知道爲每個對象分配多少空間。需要多少空間才能存儲實例變量a
? [任何有限的空間將是不夠的,因爲總會有一個額外的變量,也需要分配]
因爲那麼它會佔用「無限」的存儲,因爲它初始化時遞歸地初始化自己。但是,您可以將指針存儲到相同的結構中。
例如這是無效的:
struct a
{
int someVar;
a bad;
};
這是有效的(比方說,如果你想要這個結構的鏈接列表):
struct a
{
int someVar;
a* good;
};
因爲那將導致inifite遞歸。例如
struct foo
{
int boo;
foo f;
};
foo f;
foo
將包含foo
含有foo
等等
要解決它,你應該使用指針:
struct foo
{
int boo;
foo* f;
};
不只是結構的任何不完整的數據類型不能爲與它一起使用。 可以說你有一個結構體A,並且你已經包含了與成員體相同的結構體,現在當編譯器試圖向它分配內存時,它如何知道要分配多少內存,因爲你已經聲明瞭結構體A,它尚未完全定義它會拋出錯誤不完整的數據類型不允許。
正如其他答案指出的那樣,該結構不能包含自身的實例,因爲這會在創建結構時導致無限遞歸。然而一個結構可以包含一個指針本身:
struct foo
{
int boo;
foo *f;
};
foo f;
f.f = &f;
因爲不可能創造這樣的結構存儲器佈局。如果struct foo
包含int
和foo
,那麼如何將sizeof(int)+sizeof(foo)
字節合併到sizeof(foo)
字節中?等式A+B=A
對於A,B > 0
沒有任何解決方案。
struct bedroom
{
bed b;
table t;
bedroom r;
};
您現在看到問題了嗎?一間臥室需要存放無數張牀和桌子。
但它一直都是龜! – StackedCrooked 2012-02-20 13:06:30
你在臥室裏的桌子上做什麼? – sbi 2012-02-20 13:06:59
@sbi:把我的C++書放在上面? – fredoverflow 2012-02-20 13:15:30
- 1. 結構定義包含一個自己的靜態實例?
- 2. 爲什麼我的結構變量不包含此成員?
- 3. 爲什麼結構類型被定義爲自己的名字?
- 4. 爲什麼Mako不能找到包含它的模板?
- 5. 爲什麼我的JQuery插件沒有得到它自己的實例?
- 6. 爲什麼Ruby File類不包含大小實例方法
- 7. 爲什麼我不能包含博客?
- 8. API體系結構 - 包含什麼
- 9. 爲什麼許多nHibernate示例代碼實例包含Castle dll?
- 10. 爲什麼整個包結構需要包含在Class.forName()中?
- 11. 爲什麼Direct3D沒有自己的頂點結構?
- 12. 爲什麼結構可以存儲自己的大小?
- 13. 爲什麼java接口不能包含靜態方法實現?
- 14. 包含結構的結構與包含指針的結構
- 15. 什麼是nameser_compat.h,爲什麼不包含它?
- 16. 爲什麼它的0.0 ELB實例?
- 17. 它爲什麼包含「使用哪裏」?
- 18. 什麼是自包含功能?
- 19. 如何將結構實例賦值給包含該結構的類?
- 20. 你稱之爲結構體的實例是什麼?
- 21. 當一個類型包含它自己時該怎麼辦?
- 22. 爲什麼phonegap不嵌入它自己的webview?
- 23. 爲什麼SSL如此特別?我能不能自己實現RSA?
- 24. 爲什麼Python類定義不能爲自己分配一個閉包變量?
- 25. 爲什麼C#靜態類包含非靜態類/結構體?
- 26. 爲什麼rebar3不能編譯它自己可以編譯的依賴關係?
- 27. 爲什麼不能'基類對象'調用它自己的虛函數? C++
- 28. 爲SqlServer Express使用自己的實例?
- 29. 爲什麼NSWindow或NSView實例處理自己的關鍵事件,而不是它的委託?
- 30. 什麼是不動產?爲什麼我不能讓自己的私人空間?
閱讀:http://stackoverflow.com/questions/588623/self-referential-struct-definition – YXD 2012-02-20 11:41:51
結構有多大? – 2012-02-20 11:41:52