2013-04-30 61 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

相关问题