2017-08-12 52 views
1

例如:我怎麼能檢查參數的大小在類的構造函數在C++

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

我有類名爲Static,它的構造有一個說法v,我怎麼能檢查v「大小,如果v.size() < 3,構造函數出口

很多答案都說可以通過使用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

,對象是永遠完全構建,所以不應該調用析構函數*。 –

+0

「很多答案都說可以通過拋出異常來解決,但問題是析構函數不會被調用」 - 當然析構函數不會被調用 - 對象還沒有完全構造。 –

+0

如果出現異常,而不調用'〜Static',則調用已初始化成員的析構函數。 – Jarod42

回答

1

所以我不知道是否返回將確定爲例子:

最可能的是那也不行,因爲它會使Static實例處於無效且不正確的初始化狀態。

避免這種情況並保持一切清潔的唯一方法是引發異常。


假設你想用3固定大小來管理std:.vector<int>內部,它會更好,如果你在構造函數拋出異常來重寫你的構造類似

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

相關問題