我一直在做一些閱讀,一般的看法似乎是,儘可能地避免兩相初始化。我很同意它所說的。但我不覺得它很容易消除。避免兩相初始化
這裏是一個完全由例子,雖然極力基於一些實際的代碼 -
想象我建立一個遊戲。主遊戲類需要構建一個用於3d渲染的「RenderDevice」對象。但爲了構建它,它需要從配置文件加載一些設置。並且要繪製一個Window對象。還有一個記錄器對象和一個內存池。我的代碼現在把所有的這些東西爲類成員在構造函數中做一點,然後調用的初始化函數的每個對象上的相關參數,像: -
// Much simplified code to make a point
Game::Game()
{
memoryPool_.init(10000000); // Amount of memory to allocate
logger_.init("logfile.txt", memoryPool_);
window_.init(2000, 1000); // Make a nice big window
renderDevice_.init(window_, logger_, memoryPool_);
}
這對我來說似乎工作得相當好。但是這是兩個階段。每個對象只是由它的構造函數部分構造而成。所以我不得不做很多這樣的事情,而不是讓代碼變得「乾淨」。
Game::Game() :
memoryPool_(1000000),
logger_("logfile.txt", memoryPool_),
window_(2000, 1000),
renderDevice_(window_, logger_, memoryPool)
{
}
現在,代碼看起來相當醜陋的我,也是相當脆弱的初始化的順序取決於它們在類,這裏沒有列出的順序聲明的順序上。隨着更多的數據被添加到課堂中,情況會變得更糟。這裏的對象只需要幾個參數,但如果他們需要更多的數據,這將快速失控。
它有每個對象的構造準備做的工作的優勢,但它看起來醜陋的我,似乎相當脆弱,而且容易出錯...
所以我的問題是有我錯過了點?有一個更好的方法嗎?我應該停止擔心,只是做這個,或者我應該使用我的原始代碼?或者,我的整個設計在某種程度上是錯誤的,所以這個問題沒有用?
基本上最好的做法是什麼?
我覺得你很困惑。 – Marcin
最好的做法絕對是無論什麼原因,我不明白,你認爲醜陋和脆弱。事實是,它比兩階段初始化更堅實(也沒有醜陋)。 – syam
@Marcin Hehe我很困惑,這是閱讀太多:)好吧,我猜這不是醜陋的。我會嘗試使用它,看看它是如何工作:) – jcoder