2013-04-30 64 views
1

我寫了這樣的類:可以在初始化列表中引用該類的字段嗎?

class FastDecoder 
{ 
public: 
    FastDecoder(void); 
    ~FastDecoder(void); 
private: 
    SnapshotMessageBuilder messageBuilder; 
    DecodedMsg const& decodedMsg; 
}; 

如果正確使用messageBuilder初始化decodedMsg

FastDecoder::FastDecoder(void): 
    decodedMsg(messageBuilder.GetDecodedMsg()) 
{ 

我懷疑是FastDecoder尚未構建那麼不是所有的字段都probaly初始化,所以我可以有運行時錯誤triing訪問messageBuilder

如果我的代碼不好再怎麼改寫更好?它會繼續工作,如果我重新安排這樣的領域:

private: 
    DecodedMsg const& decodedMsg; 
    SnapshotMessageBuilder messageBuilder; 

回答

3

將它繼續工作,如果我重新安排這樣的領域[...]

沒有,因爲數據成員在他們所宣佈在類定義的順序進行初始化。因此,decodedMsg的初始化將首先發生,這意味着您將在尚未構建的對象上調用GetDecodedMsg()

另一方面,您的當前版本是可以的,因爲messageBuilder將在您初始化decodedMsg時已經構建。

+0

我真的不喜歡這樣的事情 - 當我重新排序字段聲明和一切的東西時。我應該以某種方式重構我的類,以避免「字段聲明順序依賴性」? – javapowered 2013-04-30 18:06:48

+0

@javapowered:聽起來很不錯。爲什麼你需要''codedMsg'參考btw?你可以在需要時調用'messageBuilder.GetDecodedMsg()'嗎? – 2013-04-30 18:09:08

+0

我只需要一點性能和可讀性。我正在寫低延遲代碼。 – javapowered 2013-04-30 18:10:09

相關問題