2012-05-07 133 views
0

假設結構A和B是定義單結構如下:循環構造

struct A 
{ 
    B& b_; 
    static A& shared_a() { ... } 
    A() : b_(B::shared_b()) { ... } 
}; 

struct B 
{ 
    A& a_; 
    static B& shared_b() { ... } 
    B() : a_(A::shared_a()) { ... } 
}; 

假設的文件結構被組織,以使代碼將編譯。

第一次調用A :: shared_a時,它將構造A的共享實例.A共享實例的構造函數將調用B :: shared_b,它將構造B的共享實例。接下來, B的共享實例的構造函數將調用A :: shared_a。但是,A的共享實例尚未完成其構造函數!因此,這些構造函數將無限循環。

爲了防止這樣的循環,我可以合併類A和B,但我想避免這樣做。有沒有更優雅的解決方案?

感謝,

山姆

+0

您是否驗證了無限循環問題? – jdizzle

回答

1

您的代碼表現出未定義的行爲,您可能會遇到您提到的無限循環或任何其他奇怪的行爲。現在,問題不在於如何解決它,而是打破循環依賴,這通常是一種代碼異味。

如果您仍然相信您的設計是有意義的,並且如果您的構造函數僅存儲引用(不使用對象),則可以更改構造函數以引用該對象。

同樣,我會避免循環依賴。

0

你怎麼樣給shared_a()乙本身的參考,因此在shared_a的A_constructor它可以設置參考是其B_?