2017-08-12 15 views
1

にクラスのコンストラクタに引数のサイズを確認することができます、は、どのように私は、例えば、C++

class Static { 
public: 
    Static(std::vector<int> v) { 
     if (v.size() ! = 3) { 
      //... 
     } 
    } 
    ~Static() { 
     std::cout << "Static dtor\n"; 
    } 
}; 

は私がStaticという名前のクラスがあり、そのコンストラクタはv.size() < 3場合、私はv「サイズを確認し、できる方法を引数vを、持っていますコンストラクタの出口

多くの答えはthrowを使用して解決できると言いますが、デストラクタが呼び出されないという問題があります。

ので、私はreturnの例については、大丈夫だろうかどうかを疑問に思う:

class Static { 
public: 
    Static(std::vector<int> v) { 
     if (v.size() ! = 3) { 
      //to log some error info 
      return; 
     } 
    } 
    ~Static() { 
     std::cout << "Static dtor\n"; 
    } 
}; 
+4

のようなあなたのコンストラクタを書き換える方が良いでしょう、オブジェクトは決して内部3の固定サイズでstd:.vector<int>を管理する想定


デストラクタ*は呼び出されないように完全に構​​築されています。 –

+0

"多くの答えは、例外をスローすることで解決できると言っていますが、問題はデストラクタが呼び出されないことです" - もちろん、デストラクタは呼び出されません - オブジェクトはまだ完全に構築されていません。 –

+0

例外の場合、 '〜Static'は呼び出されませんが、すでに初期化されたメンバーのデストラクタが呼び出されます。 – Jarod42

答えて

1

ので、私はリターンが例のために、大丈夫だろうか疑問に思う:

おそらくそれはOKではない、ので、無効な、不適切に初期化された状態のStaticインスタンスが残されます。

これを回避し、すべてをきれいに保つ唯一の方法は、例外をスローすることです。あなたは、コンストラクタで例外をスローした場合、それは

Static(int a, int b, int c) { 
    v_.push_back(a); 
    v_.push_back(b); 
    v_.push_back(c); 
} 
+1

しかし、throwを呼び出した後、 '〜Static()'は呼び出されないので、 '〜Static()'で 'shared_ptr'を使う方が良いでしょうか? – wang

+1

@wangここでポインタについて何か言っています。一般に、動的割り当てがある場合は、スマートポインタを使用する方がよいでしょう。これらは適切に破壊されることが保証されます。 – user0042

関連する問題