1

私はそのようなクラスを書きました:

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

messageBuilder初期化に使用するのが正しい場合はdecodedMsg?

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

FastDecoder がまだ構築されていないため、すべてのフィールドがおそらく初期化されているわけではないため、アクセスしようとすると実行時エラーが発生する可能性があると思われますmessageBuilder

私のコードが良くない場合、それをより良く書き直す方法は? そのようにフィールドを並べ替えても機能し続けますか:

private:
    DecodedMsg const& decodedMsg;
    SnapshotMessageBuilder messageBuilder;
4

1 に答える 1

3

[...] のようにフィールドを並べ替えても、機能し続けますか?

データ メンバーは、クラス定義で宣言された順序で初期化されるため、いいえ。その結果、 の初期化が最初に行われ、まだ構築されていないオブジェクトをdecodedMsg呼び出すことになります。GetDecodedMsg()

一方、現在のバージョンは、messageBuilder初期化するまでに既に構築されているため、問題ありませんdecodedMsg

于 2013-04-30T17:57:03.873 に答える