2016-09-06 17 views
2

私は初期化されていないものは自動的に初期化され、これはやや危険です(そして練習が悪い)と思います。また、初期化リストは一般的に効率的(場合によっては必要)であることも理解していますが、メンバ変数に割り当てる前に、関数呼び出しでいくつかのパラメータを検証したかったのです。私は初期化リストを利用することができるか、しかしこのような状況にコンストラクタ内のすべてを初期化する必要がありますか?

class MyObj 
{ 
    private: 
     int one_; 
     int two_; 
     DiffObj diffObj_; 

    ... // other stuff 
} 

MyObj::MyObj(int a, int b, std::string type, std::vector<double> params) 
{ 
    one_ = a; 
    two_ = b; 
    if (verifyType(type, params)) 
    { 
     diffObj_ = createDiffObj(params); 
    } 
} 

:たとえば

、典型的な割り当てコンストラクタを使用して、私はこのような何かを持っているだろうか?私はおそらくコンストラクタのいくつかのパラメータを初期化し、残りの部分を初期化するために別々の呼び出しを使用することによって考えましたが、それが正当なものかどうかはわかりません。

MyObj::MyObj(int a, int b) : 
    one_(a), 
    two_(b) 
    {} 

MyObj::initializeDiffObj(std::string type, std::vector<double> params) 
{ 
    if (verifyType(type, params)) 
    { 
     diffObj_ = createDiffObj(params); 
    } 
} 
+0

何かの初期化を指定することは必須ではありません。あなたが言うように、指定しなければ、メンバーはデフォルトで構築されます。多くの場合、これはうまくいきます。必要に応じて、2番目のコードブロックのメンバ関数を呼び出すことによって、initializer-listの中のいくつかのメンバとコンストラクタの本体の残りのメンバを初期化することができます。 – Chris

+1

"私はそれを知っています..."常に偽の声明が続いているようです –

+0

@ M.M: "考えました..."と言った方が良いかもしれません – marcman

答えて

2

このようなものは完全に合理的です。イニシャライザリストを作成し、コンストラクタ内でいくつかの作業を行うことができます。選択する必要はありません。

class MyClass { 
    public: 
     MyClass(int a, SomeStruct b) 
      : _a(a) { 
       if (isValid(b)) { 
        // Initialize _b 
        _b = createWeirdThingFromSomeStruct(b); 
       } 
     } 
    private: 
     int _a; 
     WeirdThing _b; 
}; 
+1

これはまさに私が確信していたものです。ありがとう! – marcman

1

あなたのコンストラクタは、メンバーの初期化子を提供していない場合は、そのメンバーはデフォルトの初期化です。 intの場合は、全く初期化されていないことを意味します。ユーザー提供のコンストラクタを持つクラス型の場合は、そのコンストラクタを呼び出すことを意味します。

理想的には、コンストラクタ - イニシャライザリストはすべてのメンバの初期化を行う必要があります。ここではあなたの状況のた​​めにそれを行うための一つの方法は次のとおりです。

MyObj::MyObj(int a, int b, std::string type, std::vector<double> params) 
    : one_(a), two_(b), 
     diffobj(verifyType(type, params), std::move(params)) 
{ 
} 

これ(AB)はdiffobjの初期化中verifyTypeへの呼び出しに収まるようにコンマ演算子を使用しています。照合が失敗した場合、verifyType関数は例外をスローする必要があります。

関連する問題