2012-02-20 76 views
2

我讀了關於C++中的結構,它不能包含它自己的實例。 任何人都可以幫助我理解它爲什麼不能包含它自己的實例嗎?爲什麼結構不能包含它自己的實例?

+1

閱讀:http://stackoverflow.com/questions/588623/self-referential-struct-definition – YXD 2012-02-20 11:41:51

+3

結構有多大? – 2012-02-20 11:41:52

回答

5

因爲要創建它的實例,您需要創建變量,它本身就是它的一個實例 - 它將調用構造函數。

這將導致對構造函數的無限遞歸調用。

假設class A有一個名爲a的實例變量:
調用的A構造會造成a初始化,它本身就是一個A。要做到這一點 - A的構造函數將被再次調用。

請注意,它甚至不會編譯,因爲編譯器無法爲它分配內存,它不知道爲每個對象分配多少空間。需要多少空間才能存儲實例變量a? [任何有限的空間將是不夠的,因爲總會有一個額外的變量,也需要分配]

+1

「需要多少空間才能存儲實例變量a」 - 作爲一種特殊情況,只要「A」沒有佔用空間的其他數據成員或基類,任何大小都可以工作。但是,只有在它無用的情況下,它纔是值得的。 – 2012-02-20 12:03:10

+0

應該指出,你可以動態地創建一個實例,並在同一個結構中存儲一個指向它的指針,基本上創建一個前向列表。 'struct S {int data; S *下一個; }' – zett42 2017-07-04 20:17:38

+0

那麼java是如何工作的呢? – Learner 2017-07-05 16:53:18

6

因爲那麼它會佔用「無限」的存儲,因爲它初始化時遞歸地初始化自己。但是,您可以將指針存儲到相同的結構中。

例如這是無效的:

struct a 
{ 
    int someVar; 
    a bad; 
}; 

這是有效的(比方說,如果你想要這個結構的鏈接列表):

struct a 
{ 
    int someVar; 
    a* good; 
}; 
3

因爲那將導致inifite遞歸。例如

struct foo 
{ 
    int boo; 
    foo f; 
}; 

foo f; 

foo將包含foo含有foo等等

要解決它,你應該使用指針:

struct foo 
{ 
    int boo; 
    foo* f; 
}; 
1

不只是結構的任何不完整的數據類型不能爲與它一起使用。 可以說你有一個結構體A,並且你已經包含了與成員體相同的結構體,現在當編譯器試圖向它分配內存時,它如何知道要分配多少內存,因爲你已經聲明瞭結構體A,它尚未完全定義它會拋出錯誤不完整的數據類型不允許。

1

正如其他答案指出的那樣,該結構不能包含自身的實例,因爲這會在創建結構時導致無限遞歸。然而一個結構可以包含一個指針本身:

struct foo 
{ 
    int boo; 
    foo *f; 
}; 

foo f; 
f.f = &f; 
1

因爲不可能創造這樣的結構存儲器佈局。如果struct foo包含intfoo,那麼如何將sizeof(int)+sizeof(foo)字節合併到sizeof(foo)字節中?等式A+B=A對於A,B > 0沒有任何解決方案。

5
struct bedroom 
{ 
    bed b; 
    table t; 
    bedroom r; 
}; 

您現在看到問題了嗎?一間臥室需要存放無數張牀和桌子。

+1

但它一直都是龜! – StackedCrooked 2012-02-20 13:06:30

+3

你在臥室裏的桌子上做什麼? – sbi 2012-02-20 13:06:59

+0

@sbi:把我的C++書放在上面? – fredoverflow 2012-02-20 13:15:30

相關問題